[CODEVS 2627]村村通

【问题描述】

  农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。

  约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。

  你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000。

【数据范围】

  对于所有的数据,3≤n≤100,其中n为农场个数。

【算法解析】

  最小生成树基础题,以下代码使用基于并查集维护的Kruskal算法解决。

【程序代码】 

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int SIZE=10010;
 5 struct graph{
 6     int begin,end,value;
 7 }g[SIZE];
 8 int fa[110],n,num=0,cal=0,tot=0;
 9 bool cmp(graph x,graph y)
10 {
11     return x.value<y.value;
12 }
13 int find(int x)
14 {
15     return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
16 }
17 int main()
18 {
19     scanf("%d",&n);
20     for (int i=1;i<=n;i++) fa[i]=i;
21     for (int i=1;i<=n;i++)
22     for (int j=1;j<=n;j++)
23     {
24         int t;
25         scanf("%d",&t);
26         if (i<j)
27         {
28             g[++num].begin=i;
29             g[num].end=j;
30             g[num].value=t;
31         }
32     }
33     sort(g+1,g+num+1,cmp);
34     for (int i=1;i<=num;i++)
35     {
36         if (find(g[i].begin)!=find(g[i].end))
37         {
38             fa[find(g[i].end)]=find(g[i].begin);
39             tot+=g[i].value;
40             cal++;
41         }
42         if (cal==n-1) break;
43     }
44     printf("%d",tot);
45     return 0;
46 }

声明:本博文为博主原创博文,未经允许请勿转载。

posted on 2016-02-15 15:09  Double680  阅读(158)  评论(0编辑  收藏  举报

导航