这道题如果不用并查集感觉根本无从下手,可以将题目理解为:如果两点之间有路径,那么与他们连接的其他结点也就贯通了,即可以归属于同一个集合,关于并查集方法的叙述,有一篇博客讲的很好: http://blog.csdn.net/dellaserss/article/details/7724401/
#include <iostream>
using namespace std;
int Tree[1000];
int findRoot(int x)
{
if (Tree[x] == -1) return x;
else
{
int temp = findRoot(Tree[x]); //这里用到了路径压缩算法来优化树的结构,如果无法理解,不优化也行
Tree[x] = temp;
return temp;
}
}
int main()
{
int n,m;
while (cin >> n)
{
if (n == 0) break;
cin >> m;
for (int i = 1;i <= n;i++)
{
Tree[i] = -1;
}
for (int i = 1;i <= m;i++)
{
int a,b;
cin >> a >> b;
a = findRoot(a);
b = findRoot(b);
if (a != b)
{
Tree[b] = a;
}
}
int count = 0;
for (int i = 1;i <= n;i++)
{
if (Tree[i] == -1) count++;
}
cout << count-1 << endl;
}
}