zoukankan      html  css  js  c++  java
  • L2-024 部落 (25 分)并查集

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

    输入格式:

    输入在第一行给出一个正整数N(≤),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:

    ⋯ [

    其中K是小圈子里的人数,[(,)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过1。

    之后一行给出一个非负整数Q(≤),是查询次数。随后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 <bits/stdc++.h>
    using namespace std;
    int n,q;
    int par[10004],ran[10004];
    int arr[10004];
    int find(int a)
    {
        if(a==par[a])
            return a;
        else
            return par[a]=find(par[a]);
    }
    void unite(int a,int b)
    {
        a = find(a);
        b = find(b);
        if(a==b)
            return ;
        if(ran[a]>ran[b])
            par[b] = a;
        else
        {
            par[a] = b;
            if(ran[a]==ran[b])
                ran[b]++;
        }
    }
    bool same(int a,int b)
    {
        return find(a) == find(b);
    }
    int main()
    {
        cin>>n;
        for(int i=0;i<10004;i++)
        {
            par[i] = i;
            ran[i] = 0;
        }
        int k;
        set<int> s;
        while(n--)
        {
            cin>>k;
            for(int i=0;i<k;i++)
            {
                cin>>arr[i];
                s.insert(arr[i]);
            }
            for(int i=1;i<k;i++)
                unite(arr[i-1],arr[i]);
        }
    
        int sum = s.size();
        set<int> ss;
        for(int i=1;i<=sum;i++)
        {
            int t = find(i);
            ss.insert(t);
        }
        cout<<sum<<" "<<ss.size()<<endl;
        cin>>q;
        int x,y;
        while(q--)
        {
            cin>>x>>y;
            if(same(x,y))
                cout<<"Y"<<endl;
            else
                cout<<"N"<<endl;
        }
        return 0;
    }
     
  • 相关阅读:
    用原生JS判断素(质)数,并找出100~1000之间的所有素(质)数
    用原生JS找出所有的水仙花数
    break、continue和return语句的区别
    用原生JS写16进制随机颜色
    JavaScript函数
    JavaScript数组
    JavaScript流程控制
    新的开始,新的历程
    异常处理
    DictionaryBase
  • 原文地址:https://www.cnblogs.com/tonyyy/p/10472975.html
Copyright © 2011-2022 走看看