zoukankan      html  css  js  c++  java
  • 最小生成树 Prim算法 UVALive

    题目连接:https://vjudge.net/problem/47584/origin

    题目大意:有块岛屿,岛屿上有发电站和城市,两两城市架设电线,求最少用多长电线。

    解题思路:最小生成树套模板就水过了~。

    最小生成树:一个包含所有点并使得所有连接点的边的权值最小。

    Prim算法知识点:任意一点的所有边中,权值最小的边包含于最小生成树中。

    详释博客:https://blog.csdn.net/qq_35644234/article/details/59106779

    ac代码:

     1 #include<iostream>
     2 #include<vector>
     3 #include<cstring>
     4 using namespace std;
     5 struct point{
     6     int y,z;
     7 };
     8 int visit[1005];
     9 int main()
    10 {
    11     int n;
    12     while(cin>>n)
    13     {
    14         int count=1;
    15         while(n--)
    16         {
    17             vector<int> num;
    18             vector<point> ay[1005];
    19             int x,y,z,a,b,c,sd,min,ans=0;
    20             point now,next;
    21             memset(visit,0,sizeof(visit));
    22             cin>>a>>b>>c;
    23             for(int i=1;i<=c;i++)
    24             {
    25                 cin>>sd;
    26                 num.push_back(sd);
    27                 visit[sd]=1;
    28             }
    29             for(int i=1;i<=b;i++)
    30             {
    31                 cin>>x>>y>>z;
    32                 now.y=y;now.z=z;
    33                 ay[x].push_back(now);
    34                 now.y=x;now.z=z;
    35                 ay[y].push_back(now);
    36             }
    37             while(num.size()<a)//Prim算法
    38             {
    39                 min=99999999;
    40                 for(int i=0;i<num.size();i++)//遍历当前点的集合 
    41                 for(int j=0;j<ay[num[i]].size();j++)//遍历当前点所有的边 
    42                 {
    43                     if(!visit[ay[num[i]][j].y]&&ay[num[i]][j].z<=min)//当可扩点未访问且权值小于当前发现最小的权值边 
    44                     {
    45                         next.y=ay[num[i]][j].y;
    46                         min=next.z=ay[num[i]][j].z;
    47                     }
    48                 }
    49                 visit[next.y]=1;
    50                 num.push_back(next.y);//该点加入点集合 
    51                 ans+=next.z;//总长度增加 
    52             //    cout<<"#"<<ans<<" "<<next.y<<" "<<next.z<<endl;
    53             }
    54             cout<<"Case #"<<(count++)<<": "<<ans<<endl;
    55             //for(int i=0;i<num.size();i++)
    56             //cout<<num[i]<<" ";
    57             //cout<<endl;
    58         }    
    59     }
    60     return 0;
    61 }
  • 相关阅读:
    PgSql备份pg_dump与还原手记pg_restore(转)
    精通 JS正则表达式(转)
    88个常用英语词语搭配
    C3P0 代码分析
    windows 域名+虚拟目录 (php)
    postgresql 查询字段中的某些数据
    Memcached 在windows下的安装 支持 phpwind 后台Memcache 缓存配置
    正则表达式学习笔记
    Word2007快捷键大全
    Windows 版本说明
  • 原文地址:https://www.cnblogs.com/wwq-19990526/p/9390537.html
Copyright © 2011-2022 走看看