【hdu 1232】円滑工事【調査集】


Problem Description
ある省は都市交通状況を調査し、既存の都市道路統計表を得て、各道路が直接つながっている都市をリストした.省政府の「円滑な工事」の目標は、全省のどの2つの都市間でも交通を実現させることである(ただし、直接的な道路がつながっているとは限らず、互いに間接的に道路を通過すればよい).最低でも何本の道路を建設する必要がありますか?
 
Input
テスト入力には、いくつかのテスト例が含まれます.各試験例の第1行は、都市数N(<1000)と道路数Mの2つの正の整数を与える.その後のM行はM道に対応し、各行は正の整数のペアを与え、それぞれこの道が直接つながっている2つの町の番号である.簡単にするために、町は1からN番までです.
注意:2つの都市の間には複数の道路が通じ合うことができます.つまり、
3 3
1 2
1 2
2 1
この入力も合法的です
Nが0の場合、入力は終了し、この例は処理されない.
 
Output
各試験例に対して,1行で最低でも建設が必要な道路数を出力する.
 
Sample Input

   
   
   
   
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0

 
Sample Output

    
    
    
    
1 0 2 998

 
#include <stdio.h>

int father[1002];

int find(int x)// 
{
	if(x!=father[x])
		father[x]=find(father[x]);// 
	return father[x];
}

void Union(int a, int b)// 
{
	int x=find(a);
	int y=find(b);
	if(x!=y)
		father[y]=x;
}

int main()
{
	int n, m, i, x, y, count;

	while(scanf("%d", &n),n)
	{
		for(i=1; i<=n; i++)
			father[i]=i;

		for(scanf("%d",&m); m>0; m--)
		{
			scanf("%d%d", &x, &y);
			Union(x, y);
		}

		for(count=-1, i=1; i<=n; i++)
			if(father[i]==i)
				count++;
		printf("%d
", count); } }