题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1232
题意:
省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
题解:
并查集,道路互相连通的则属于同一个集合,求出不同集合数即可
代码如下:
#include <stdio.h>
int prec[10010];
int find(int x)
{
return x==prec[x]?x:find(prec[x]);
}
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy) prec[fx]=fy;
}
int main()
{
int n,m,i,a,b;
while(~scanf("%d",&n),n)
{
scanf("%d",&m);
for(i=1;i<=n;i++)
prec[i]=i;
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
join(a,b);
}
int ans=0;
for(i=1;i<=n;i++)
if(prec[i]==i)ans++;
printf("%d\n",ans-1);
}
return 0;
}