kruskal(1)

来源:互联网 发布:python工厂模式 编辑:程序博客网 时间:2024/06/05 11:56

     就因为这个kruskal我几乎崩溃了,在我机子上运行一切完好的程序可是一提交zoj就说我段错误,我知道我犯了很严重的错误,关键我自己就是找不出来,先把代码晾这,可是这代码是错误的

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define MAX 1000int 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);elseprintf(" Data Error!\n");return 0;}


0 0
原创粉丝点击