题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1232
题解:
纯并查集,此题相当于算可以实现交通集合的个数,第一个数据,1-3 4-3相连,就有两个各自互相连通的集合,1-3-4、2,需要建的道路为连通集合个数减1.
代码:
#include<cstdio>
#include<cstring>
int fa[1001];
bool visit[1001];
int find(int a)
{
return fa[a]==a?a:fa[a]=find(fa[a]);
}
int main()
{
int N,M;
while(~scanf("%d",&N))
{
if(N==0) return 0;
scanf("%d",&M);
int i;
for(i=1;i<=N;i++)
{
fa[i]=i;
}
memset(visit,0,sizeof(visit));
for(i=1;i<=M;i++)
{
int a,b;
scanf("%d%d",&a,&b);
int a_boot,b_boot;
a_boot=find(a);
b_boot=find(b);
if(a_boot!=b_boot)
{
fa[a_boot]=b_boot;
}
}
int ans=0;
for(i=1;i<=N;i++)
{
int i_boot=find(i);
if(visit[i_boot]==0)
{
ans++;
visit[i_boot]=1;
}
}
printf("%d\n",ans-1);
}
return 0;
}