题目意思直接,明显并查集;
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int x[1005];
int root(int a) //找根(路径压缩)
{
if(x[a]==a)
return a;
else
return (x[a]=root(x[a]));
}
void lian(int a,int b) //连接两个不相关数据
{
int f1=root(a);
int f2=root(b);
if(f1!=f2)
{
if(f1>=f2) //指向更小的一个数据
x[f1]=f2;
else
x[f2]=f1;
}
}
int main()
{
int M,N,a,b;
while(scanf("%d",&N))
{
if(N==0)
break;
else
{
scanf("%d",&M);
if(M==0)
{
printf("%d\n",N-1);
continue;
}
for(int i=1;i<=N;i++) //初始化数据,各数组指向自己
x[i]=i;
while(M--)
{
scanf("%d %d",&a,&b);
lian(a,b);
}
}
int sum=-1;
for(int i=1;i<=N;i++) //统计需要修道路
if(x[i]==i)
sum++;
printf("%d\n",sum);
}
return 0;
}