就因为这个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