就因为这个kruskal我几乎崩溃了,在我机子上运行一切完好的程序可是一提交zoj就说我段错误,我知道我犯了很严重的错误,关键我自己就是找不出来,先把代码晾这,可是这代码是错误的
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define MAX 1000 int n,m,father[MAX],son[MAX]; int flag=0; double sum=0.0; struct edge { int a; int b; double w; }edges[MAX]; int cmp(const void *a,const void *b) { edge aa=*(const edge *)a; edge bb=*(const edge *)b; return aa.w-bb.w; } void UFset() { int i; for(i=1;i<=m;++i) { father[i]=i; son[i]=1; } } int unionsearch(int x) { return x == father[x] ? x : unionsearch(father[x]); } bool Find(int x,int y) { int root1=unionsearch(x); int root2=unionsearch(y); if(root1==root2) return false; else if(son[root1]>=son[root2]) { father[root2]=root1; son[root1]+=son[root2]; } else { father[root1]=root2; son[root2]+=son[root1]; } return true; } void kruskal() { int i,total=0; UFset(); for(i=1;i<=n;++i) { if(Find(edges[i].a,edges[i].b)) { // printf(""); printf("%d->%d=%0.2lf\n",edges[i].a,edges[i].b,edges[i].w); sum+=edges[i].w; total++; } if(total==m-1) break; flag=1; } } int main() { //freopen("in.txt","r",stdin); int i; scanf("%d %d",&m,&n); for(i=1;i<=n;++i) scanf("%d %d %lf",&edges[i].a,&edges[i].b,&edges[i].w); cout<<endl; qsort(edges,n+1,sizeof(edges[0]),cmp); kruskal(); if(flag) printf("%0.2lf\n",sum); else printf(" Data Error!\n"); return 0; }
原文:http://blog.csdn.net/yuzibo747/article/details/19018335