题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=608 畅通工程
最裸的并查集应用:只需要查找集合的个数,然后集合个数-1就是要修的路的条数,代码如下:
#include<stdio.h>
int f[1005],rank[1005];
int find(int x)
{
if(x==f[x]) return x;
return find(f[x]);
}
void merge(int p,int q)
{
if(p==q) return;
if(rank[p]>=rank[q])
{
f[q]=p;
rank[p]+=rank[q];
}
else
{
f[p]=q;
rank[q]+=rank[p];
}
return;
}
int main()
{
int t,r,a,b;
while(scanf("%d",&t)&&t)
{
scanf("%d",&r);
for(int i=0;i<1005;i++)
{
f[i]=i;
rank[i]=1;
}
int ans=-1;
for(int i=0;i<r;i++)
{
scanf("%d%d",&a,&b);
a=find(a);b=find(b);
merge(a,b);
}
for(int i=1;i<=t;i++)
if(i==f[i])
ans++;
printf("%d\n",ans);
}
}