美文网首页
L2_024部落(并查集)

L2_024部落(并查集)

作者: 我好菜啊_ | 来源:发表于2018-03-29 22:09 被阅读0次

    在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。


    输入格式:
    输入在第一行给出一个正整数N(<= 104),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:
    K P[1] P[2] ... P[K]
    其中K是小圈子里的人数,P[i](i=1, .., K)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过104。
    之后一行给出一个非负整数Q(<= 104),是查询次数。随后Q行,每行给出一对被查询的人的编号。


    输出格式:
    首先在一行中输出这个社区的总人数、以及互不相交的部落的个数。随后对每一次查询,如果他们属于同一个部落,则在一行中输出“Y”,否则输出“N”。


    输入样例:
    4
    3 10 1 2
    2 3 4
    4 1 5 7 8
    3 9 6 4
    2
    10 5
    3 7
    输出样例:
    10 2
    Y
    N


    #include <iostream>
    #define N 10001
    using namespace std;
    int father[N];
    int have[N] = { 0 };
    int cnt=0;
    int popu = 0;
    int getFather(int x)
    {
        if (father[x] != x) father[x] = getFather(father[x]);
        return father[x];
    }
    void Union(int x, int y)
    {
        int fx = getFather(x);
        int fy = getFather(y);
        if (fx != fy) {
            father[fx] = fy;
            --cnt;
        }
    }
    int main()
    {
        int n; cin >> n;
        for (int i = 0; i < n; ++i) {
            int k; cin >> k;
            int last;
            for (int j = 0; j < k; ++j) {
                int cur; cin >> cur;
                if (!have[cur]) {
                    father[cur] = cur;
                    have[cur] = 1;
                    ++popu;
                    ++cnt;//注意每增加一个人就增加一个部落
                }
                if (j) {
                    //不是第一个
                    Union(last, cur);
                }
                last = cur;
            }
        }
        cout << popu << " " << cnt << endl;
        int cmd; cin >> cmd;
        for (int i = 0; i < cmd; ++i) {
            if (i)
                cout << endl;
            int x, y; cin >> x>>y;
            if (getFather(x) == getFather(y))
                cout << "Y";
            else
                cout << "N";
        }
        system("pause");
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:L2_024部落(并查集)

          本文链接:https://www.haomeiwen.com/subject/uvwvcftx.html