hdu1232 畅通工程 (并查集)(浙师大OJ1307)

题目:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

想法:并查集的基础题,至于什么是并查集,如果不知道的看这个并查集详解上面讲的肯定比我解释的好。(语文不好不解释)一些解释会在代码里注释,应该比较详细的了吧。(写这东西就是给自己以后看的 肯定会忘的)刚看了并查集,还没做过的人,看代码应该就懂了怎么操作的。

#include<iostream>
using namespace std;
int father[1000],n,m;
void xxx()   //这个函数用来初始化,每个节点的初始父节点是它本身 
{
	for(int i=1;i<=n;i++)
	  father[i]=i;
}
int find(int x)//这个函数找父节点 
{
	while(father[x]!=x)x=father[x];//如果它的父节点不是它自己。。。。。。到找到最终的那个根节点为止 
	return x;
}
void compar(int a,int b)//两条路连接 
{
	int temp_a=find(a);
	int temp_b=find(b);
	if(temp_a!=temp_b)father[temp_a]=temp_b;//因为这是两条路连接了 所以根节点就要变成同一个 
}
int resu()
{
	int su=0;
	for(int i=1;i<=n;i++)//找到几个父节点,数量减一就是要修的最少的路 
	{
		if(father[i]==i)su++;
	}
	return su;
}
int main()
{
	while(cin>>n&&n!=0)
	{
		cin>>m;
		if(m==0)
		{
			cout<<n-1<<endl;
			continue;
		}
		xxx();
		for(int i=1;i<=m;i++)
		{
			int a,b;
			cin>>a>>b;
			compar(a,b);
		}
	    int h=resu();
		cout<<h-1<<endl;
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值