题意:问最少需要建多少路才能使所有的城镇联通
题解:并查集
/*并查集 */
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<vector>
int pre[1001];
int found(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r]; //寻找根节点
int i=x,j;
while(i!=r) //路径压缩 合并集合
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF&&n)
{
for(int i=1;i<=n;i++)
pre[i]=i;
int x,y;
int sum=n-1;
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
x=found(x);
y=found(y);
if(x!=y)//不在同一个集合
{
sum--;
pre[y]=x;
}
}
printf("%d\n",sum);
}
return 0;
}