hdu 1232畅通工程

     这是一个比较简单的并查集题目。我们把每一片城区看做一个集合(图的一个连通集),然后统计一共有k个集合,连接两个集合需要1条边,从而整个需要 k-1条边。
#include<iostream>
using namespace std;
#define MAX_SIZE 1000
int parent[MAX_SIZE];
int findParent(int i);
void Union(int i, int j);
int main(){
	int i, j,k, n, e,ans;
	while (scanf("%d",&n)&&n){
		scanf("%d",&e);
		memset(parent, -1, sizeof(parent));
		for (k = 0; k < e; k++){
			scanf("%d%d",&i,&j);
			Union(i, j);                //合并i与j所在的集合
		}
		ans = 0;
		for (i = 1; i <= n;i++)        //统计有多少个集合(连通集)
		   if (parent[i] ==-1)
			  ans++;
		printf("%d\n", ans-1);
	}
	return 0;
}
int findParent(int i){
	if (parent[i] == -1)
		return i;
	else
		return parent[i] = findParent(parent[i]);  //状态压缩
}
void Union(int i, int j){
	i = findParent(i);
	j = findParent(j);
	if (i!=j)       //如果不在同一集合就合并它们,这步不能省
	  parent[i] = j;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值