`
java-mans
  • 浏览: 11389190 次
文章分类
社区版块
存档分类
最新评论

hdu1102 很好的最小生成树克鲁斯卡尔算法

 
阅读更多
有些点城镇已经连通好了  但是我们在做的时候是求剩下的连通起来要花多少钱
我们可以依然把这些已经连通好的边放进我们将要连通的所有边中  不过花费是0
这样依旧求出的是最短路   注意找的是最短路
#include<stdio.h>
#include<stdlib.h>
int map[105][105];
struct haha
{
	int view1;
	int view2;
	int value;
}e[30000+5];
int parent[10005];
int cmp(const void *a,const void *b)
{
	return (*(struct haha *)a).value-(*(struct haha *)b).value;
}
int get_root(int x)
{
	return x==parent[x]?x:get_root(parent[x]);
}
int join(int x,int y)
{
	int root1,root2;
	root1=get_root(x);
	root2=get_root(y);
	// printf("root1=%d root2=%d\n",root1,root2);
	if(root1==root2) return 0;
	else parent[root1]=root2;
	return 1;
}
int main()
{
	int i,j,n,k,x,y,c,ans;
	while(scanf("%d",&n)!=EOF)
	{
		c=1;ans=0;
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				scanf("%d",&map[i][j]);
			for(i=1;i<=n;i++)
				for(j=1;j<=n;j++)
				{
					
					if(map[i][j])
					{
						e[c].view1=i;
						e[c].view2=j;
						e[c].value=map[i][j];
						c++;
					}
				}
				for(i=0;i<=102;i++)
					parent[i]=i;
				scanf("%d",&k);
				i=c;
				for(c;c<i+k;c++)
				{
					scanf("%d %d",&x,&y);
					e[c].view1=x;
					e[c].view2=y;
					e[c].value=0;
				}
				//  printf("%d",c);
				qsort(e+1,c-1,sizeof(e[0]),cmp);
				//  for(i=1;i<c;i++)
				//   printf("value=%d\n",e[i].value);
				//  printf("c=%d\n",c);
				for(i=1;i<c;i++)
				{
					//   printf("i=%d:",i);
					if(join(e[i].view1,e[i].view2))
					{
						ans=ans+e[i].value;
					}
				}
				printf("%d\n",ans);
	}
	return 0;
}
关于PAT(Programming Ability Test)培训的报名~


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics