并查集问题,要打通N个城镇,说明需要建立N-1条路,那么添加一个修建的路,就需要判断是不是已经联通(移动,小灵通),联通了就减去1。代码很简单,如下:
#include <iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 1100
#define repf(i,from,to) for(int i =from ; i<=to ; i++)
#define ll long long
int pre[MAX];
struct Node{
double a ,b ;
}nodes[MAX];
int M ,N ;
int Find(int x)
{
if(x!=pre[x])
{
pre[x]=Find(pre[x]);
}
return pre[x];
}
int main(){
while(~scanf("%d",&N)&&N!=0)
{
int res = N-1 ;
for(int i = 1; i <=N;i++)
{
pre[i]=i;
}
scanf("%d",&M);
int index = 0 ,a,b;
while(M--)
{
scanf("%d%d",&a,&b);
int fa = Find(a);
int fb = Find(b);
if(fa!=fb)
{
pre[fa]=fb;
res -- ;
}
}
cout << res <<endl;
}
}