zoukankan      html  css  js  c++  java
  • L2-024. 部落

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

    输入格式:

    输入在第一行给出一个正整数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>
    #include <map>
    #include <algorithm>
    #define Max 10005
    using namespace std;
    int n;
    int k,q,a,b,c = 0;
    int f[Max];
    int vis[Max];
    int getf(int x)
    {
        if(f[x] != x)f[x] = getf(f[x]);
        return f[x];
    }
    void counti(int x)
    {
        if(!vis[x])
        {
            vis[x] = 1;
            c ++;
        }
    }
    void init()
    {
        for(int i = 1;i <= 10000;i ++)
        {
            f[i] = i;
        }
    }
    void uni(int x,int y)
    {
        int xx = getf(x);
        int yy = getf(y);
        if(xx != yy)f[yy] = xx;
    }
    int countp()
    {
        int co = 0;
        for(int i = 1;i <= c;i ++)
        {
            if(f[i] == i)co ++;
        }
        return co;
    }
    int main()
    {
        cin>>n;
        init();
        for(int i = 0;i < n;i ++)
        {
            cin>>k;
            if(k)
            {
                cin>>b;
                counti(b);
            }
            for(int j = 1;j < k;j ++)
            {
                cin>>a;
                counti(a);
                uni(a,b);
                b = a;
            }
        }
        cout<<c<<' '<<countp()<<endl;
        cin>>q;
        for(int i = 0;i < q;i ++)
        {
            cin>>a>>b;
            if(getf(a) == getf(b))cout<<'Y'<<endl;
            else cout<<'N'<<endl;
        }
    }

     重温:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <vector>
    #include <set>
    using namespace std;
    int n,k;
    int f[10001];
    void init() {
        for(int i = 1;i <= 10000;i ++) {
            f[i] = i;
        }
    }
    int get(int x) {
        if(x != f[x]) return f[x] = get(f[x]);
        return f[x];
    }
    void mer(int a,int b) {
        int x = get(a),y = get(b);
        if(x != y) {
            f[x] = y;
        }
    }
    int main() {
        int a,b,q,num = 0,fnum = 0;
        cin>>n;
        init();
        for(int i = 0;i < n;i ++) {
            cin>>k;
            cin>>a;
            num = max(num,a);
            for(int j = 1;j < k;j ++) {
                cin>>b;
                num = max(num,b);
                mer(a,b);
                a = b;
            }
        }
        for(int i = 1;i <= num;i ++) {
            if(get(i) == i) fnum ++;
        }
        cout<<num<<' '<<fnum<<endl;
        cin>>q;
        for(int i = 0;i < q;i ++) {
            cin>>a>>b;
            puts(f[a] == f[b] ? "Y" : "N");
        }
    }
  • 相关阅读:
    开源数据库
    深度学习TensorFlow笔记——学习率
    深度学习TensorFlow笔记——损失函数
    深度学习TensorFlow笔记
    Oracle常用内置函数
    Oracle数据库自带表或者视图
    Oracle数据库查询所有关键字
    IP代理网址
    时间、日历(time、calendar、datatime)
    selenium常用操作
  • 原文地址:https://www.cnblogs.com/8023spz/p/7852192.html
Copyright © 2011-2022 走看看