HLG1073

#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;
}

你可能感兴趣的:(HLG)