题目描述:给出图,要你求是否存在最小生成树,如果存在,要求输出最小权值和,如果不存在,输出?
解题报告:又是一个最裸的克鲁斯卡尔,并且要判断是否存在最小生成树的问题。废话不多说,给个短代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }