其他分享
首页 > 其他分享> > hdu1233 还是畅通工程(kruskal+并查集)

hdu1233 还是畅通工程(kruskal+并查集)

作者:互联网

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 71430    Accepted Submission(s): 32276


Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。   Input 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。   Output 对每个测试用例,在1行里输出最小的公路总长度。   Sample Input 3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0   Sample Output 3 5  
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m;
 5 const int MAX=5005;
 6 struct Edge{
 7     int from,to,val;
 8 }edge[MAX];
 9 int fa[MAX];
10 
11 bool cmp(Edge x,Edge y){
12     return x.val<y.val;
13 }
14 
15 int find(int x){
16     int k=x;
17     while(fa[k]!=k)k=fa[k];
18     return k;
19 }
20 
21 int kruskal(){
22     int res=0;
23     for(int i=1;i<=n;i++)fa[i]=i;
24     sort(edge,edge+m,cmp);
25     for(int i=0,k=0;i<m&&k<n-1;i++){
26         int fx=find(edge[i].from),fy=find(edge[i].to);
27         if(fx!=fy){
28             fa[fx]=fy;
29             k++;
30             res+=edge[i].val;
31         }
32     }
33     return res;
34 }
35 
36 int main(){
37     while(scanf("%d",&n),n){
38         m=n*(n-1)/2;
39         for(int i=0;i<m;i++){
40             scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].val);
41         }
42         printf("%d\n",kruskal());
43     }
44 }

 

标签:int,hdu1233,kruskal,查集,测试用例,村庄,MAX,公路,Edge
来源: https://www.cnblogs.com/ChangeG1824/p/11679535.html