#include <iostream>
#define N 50005
using namespace std;
int fa[N]; ///定义N个父节点
int num[N]; ///用于记录每组有多少个对象
void init(int n){
for(int i = 0; i < n; ++i)
{
fa[i] = i; ///初始化每个对象的父节点是它本身
//num[i] = 1; ///每组的对象自然初始化为 --1
}
}
int find(int u)
{
///找此对象的祖先
if(fa[u] != u)
{
fa[u] = find(fa[u]); ///如果当前不是他的祖先,就一直递归的找下去
}
return fa[u]; ///当找到他的祖先后返回祖先
}
void unin(int u, int v)
{
int fau = find(u); ///找对象u 的祖先将其值赋给 fau
int fav = find(v); ///同上
if(fau == fav) return ; ///如果u和v 是同一祖先 函数结束
fa[fav] = fau; ///如果u和v 不是同一祖先 因为题目所说,他两现在有
///关系了,自然他们的祖先应该统一了
//num[fau] += num[fav]; ///将两组成员合并
//num[fav] = 0;
///自然将其一清零
}
int main()
{
int n, m;
int x, y;
int cut;
while(cin >> n >> m)
{
init(n);
while(m--)
{
cin >> x >> y;
unin(x, y);
}
cut = 0;
int f0 = find(0);
for(int i = 0; i < n; ++i)
if(f0 == find(i))
cut++;
cout << cut << endl;
}
return 0;
}
记得这道题就是套模板