http://acm.hdu.edu.cn/showproblem.php?pid=1233
题意:就是裸的最小生成树。这里用的是kruskal
使用的是并查集,将按距离排序的边,分别把点加到集合里。节点存在在集合里说明是环路。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,s,k; int par[105]; struct point { int x,d,y; }; point p[5005]; int cmp(point a,point b) { return a.d<b.d; } int find(int x) { return par[x] == x ? x : par[x] = find(par[x]); } void unite(int x, int y,int i) { x = find(x); y = find(y); if(x == y) return; s+=p[i].d; k++; par[x] = y; } int main(){ while(~scanf("%d",&n)&&n!=0){ int m=n*(n-1)/2; for(int i=0;i<m;i++){ scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].d); } s=0;k=0; for(int i=1;i<=n;i++){ par[i]=i; } sort(p,p+m,cmp); for(int i=0;i<m;i++){ unite(p[i].x,p[i].y,i); if(k==n-1)break; } printf("%d ",s); } return 0; }