kruskal解决最小生成数问题
还是畅通工程
https://www.nowcoder.com/practice/d6bd75dbb36e410995f8673a6a2e2229
#include <iostream> #include <typeindex> #include <bits/stdc++.h> #include <vector> using namespace std; typedef struct edge{ int x,y; int length; }; vector<int> num; int find(int x){ return num[x]==x?x:find(num[x]); } bool cmp(edge x,edge y){ return x.length<y.length; } void Union(int x,int y){ num[find(x)]=y; } bool isOver(int n){ int ans=0; for(int i=0;i<n;i++){ if(find(i)==i){ ans++; } } if(ans==1){ return true; } return false; } int main() { int n; while(cin>>n){ if(n==0){ return 0; } for(int i=0;i<=n;i++){ num.push_back(i); } edge side[n*(n-1)/2]; for(int i=0;i<n*(n-1)/2;i++){ cin>>side[i].x>>side[i].y>>side[i].length; } sort(side,side+n*(n-1)/2,cmp); int ans=0; for(int i=0;i<n*(n-1)/2;i++){ if(find(side[i].x)!=find(side[i].y)){ ans+=side[i].length; Union(side[i].x, side[i].y); if(isOver(n)){ break; } } } cout<<ans<<endl; num.clear(); } } // 64 位输出请用 printf("%lld")