并查集问题。
就是需要修多少条道路将所有村子的连通。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 100000001
using namespace std;
int a[1001];
int intset(int n)
{
for(int i=0; i<=n; i++)
a[i]=i;
}
int fa(int x)
{
if(x!=a[x])
x=fa(a[x]);
return a[x];
}
int main()
{
int n,m;
while(scanf("%d",&n),n)
{
scanf("%d",&m);
int x,y;
intset(n);
while(m--)
{
scanf("%d%d",&x,&y);
x=fa(x),y=fa(y);
if(x!=y)a[y]=x;
}
int ans=-1;
for(int i=1;i<=n;i++)
if(a[i]==i)ans++;
printf("%d\n",ans);
}
}