hdu 1863 kruskal 最小生成树
#include<iostream> #include<algorithm> using namespace std; int f[1001], sum, m, n; struct node{ int x, y, w; }p[1001]; bool cmp(const node &a, const node &b){ return a.w<b.w; } int find(int x) { return f[x]-x ? f[x]=find(f[x]) : x; } void kruskal() { int con=0, i; sum=0; for(i=1; i<=m; i++) { f[i]=i; } sort(p, p+n, cmp); for(i=1; i<=n; i++) { int a=find(p[i].x); int b=find(p[i].y); if(a-b) { f[a]=b;sum+=p[i].w;con++; } } if(con==m-1) cout<<sum<<endl; else cout<<"?\n"; return; } int main() { while(cin>>n>>m, n) { for(int i=1; i<=n; i++) { cin>>p[i].x>>p[i].y>>p[i].w; } kruskal(); } return 0; }