HDU 1863 畅通工程 最下生成树问题

题目描述:给出图,要你求是否存在最小生成树,如果存在,要求输出最小权值和,如果不存在,输出?

解题报告:又是一个最裸的克鲁斯卡尔,并且要判断是否存在最小生成树的问题。废话不多说,给个短代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 const int MAX = 100+5;
 4 int N,M,prim[MAX];
 5 int find(int k) {
 6 return prim[k]==k? k:prim[k] = find(prim[k]);
 7 }
 8 struct node {
 9     int x,y,length;
10 }rode[MAX];
11 int cmp(node a,node b) {
12     return a.length<b.length;
13 }
14 int main() {
15     while(scanf("%d%d",&N,&M),N) {
16         for(int i = 0;i<N;++i)
17         scanf("%d%d%d",&rode[i].x,&rode[i].y,&rode[i].length);
18         std::sort(rode,rode+N,cmp);
19         for(int i = 1;i<=M;++i)
20         prim[i] = i;
21         int sum = 0;
22         for(int i = 0;i<N;++i)
23         if(find(rode[i].x) != find(rode[i].y)) {
24             prim[find(rode[i].x)] = find(rode[i].y);
25             sum+=rode[i].length;
26         }
27         bool flag = 0;
28         for(int i = 2;i<=M;++i)
29         if(find(i) != find(1)) {
30             flag = 1;
31             break;
32         }
33         if(flag) {
34             printf("?
");
35             continue;
36         }
37         printf("%d
",sum);
38     }
39     return 0;
40 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3226412.html