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

本文介绍了一种解决点城镇连通问题的方法,通过将已连通的边视为花费为0的边,利用并查集算法寻找最短路径。通过实例演示算法的应用过程,并提供了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有些点城镇已经连通好了  但是我们在做的时候是求剩下的连通起来要花多少钱
我们可以依然把这些已经连通好的边放进我们将要连通的所有边中  不过花费是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)培训的报名~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值