建立权重并查集,水过。
可以直接写while(cin >> N),感觉比C的!EOF好用。
#include <iostream>
using namespace std;
int findroot(int a) ;
void unionroot(int a, int b) ;
int city[1005] ;
int weight[1005] ;
int main()
{
int N = 0 ,M = 0 ;
int a =0 , b = 0 ;
int result = 0;
while(cin >> N)
{
if(N==0)
break;
cin >> M ;
for(int i = 1; i<=N ; i++)
{
city[i] = i ;
weight[i] = 1 ;
}
result = 0 ;
while(M--)
{
cin >> a >> b ;
int roota = 0 ,rootb = 0 ;
roota = findroot(a) ;
rootb = findroot(b) ;
if(roota != rootb)
unionroot(roota, rootb);
}
for(int i = 1; i<=N ; i++)
{
if(city[i]==i)
result++ ;
}
cout << result -1 << endl ;
}
return 0;
}
int findroot(int a)
{
while(a!=city[a])
{
a = city[a] ;
}
return a ;
}
void unionroot(int a, int b)
{
if(weight[a]>weight[b])
{
city[b] = a ;
weight[a]+=weight[b] ;
}
else
{
city[a] = b ;
weight[b]+=weight[a] ;
}
}