利用简单并查集解决,每输入一个数据改变相应元素的祖宗,统计完毕后,数组遍历查看有N个连通的区域。想要让这些连通区域全部连通成一个整体,只需要添加N-1条道路即可。
每组数据都需要初始化数组,令它们的祖宗都是他们自己(即一开始每个城镇都没有连通),分析完毕。
#include<stdio.h>
#include<stdlib.h>
void init(int max);
void unionf(int m,int n);
int getf(int num);
int array[1000];
int main(int argc,char* argv[])
{
int m,n;
while(scanf("%d",&m),m)
{
scanf("%d",&n);
init(m);
while(n--)
{
int i,j;
scanf("%d%d",&i,&j);
unionf(i,j);
}
int ind,num;
for(ind=1,num=0;ind<=m;ind++)
if(array[ind]==ind)
num++;
printf("%d\n",num-1);
}
return EXIT_SUCCESS;
}
void init(int max)
{
int i;
for(i=1;i<=max;i++)
array[i]=i;
return;
}
void unionf(int m,int n)
{
int i,j;
i=getf(m);
j=getf(n);
if(i!=j)
array[j]=i;
return;
}
int getf(int num)
{
if(array[num]==num)
return num;
else
{
array[num]=getf(array[num]);
return array[num];
}
}