首页 > 其他 > 详细

kruskal(1)

时间:2014-02-10 00:27:10      阅读:460      评论:0      收藏:0      [点我收藏+]

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

}


kruskal(1)

原文:http://blog.csdn.net/yuzibo747/article/details/19018335

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!