hdu3367并查集+Kruskal
我靠,怎么过不了,不行 明天继续debug 明明过样例了 我的天。。。。
次奥,打错了一个代码半天没找出来!!!哭啊。。
这里记一下,kruskal是无环图。
先贴挫代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 10005 using namespace std; int p[maxn],sum; int set[maxn]; struct node{ int c1; int c2; int len; }q[10*maxn]; int cmp(node q1,node q2) { return q1.len>q2.len; } int find(int x) { if(x!=p[x]) p[x]=find(p[x]); return p[x]; } void unions(int x,int y) { p[x]=y; } int main() { //freopen("input.txt","r+",stdin); int i,n,m,fx,fy; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0)break; memset(set,0,sizeof(set)); sum=0; for(i=1;i<=m;i++) { scanf("%d%d%d",&q[i].c1,&q[i].c2,&q[i].len); } for(i=0;i<n;i++) p[i]=i; sort(q+1,q+m+1,cmp); for(i=1;i<=m;i++) { fx=find(q[i].c1); fy=find(q[i].c2); if(fx==fy) { if(!set[fx]) { set[fx]=1; sum+=q[i].len; } continue; } if(set[fx]&&set[fy])continue; if(set[fx]&&!set[fy]) { unions(fy,fx); } else { unions(fx,fy); } sum+=q[i].len; } cout<<sum<<endl; } return 0; }