zoukankan      html  css  js  c++  java
  • AtCoder Beginner Contest 049 & ARC065 連結 / Connectivity AtCoder

    Problem Statement

     

    There are N cities. There are also K roads and L railways, extending between the cities. The i-th road bidirectionally connects the pi-th and qi-th cities, and the i-th railway bidirectionally connects the ri-th and si-th cities. No two roads connect the same pair of cities. Similarly, no two railways connect the same pair of cities.

    We will say city A and B are connected by roads if city B is reachable from city Aby traversing some number of roads. Here, any city is considered to be connected to itself by roads. We will also define connectivity by railways similarly.

    For each city, find the number of the cities connected to that city by both roads and railways.

    Constraints

     

    • 2≦N≦2*105
    • 1≦K,L≦105
    • 1≦pi,qi,ri,siN
    • pi<qi
    • ri<si
    • When ij(pi,qi)≠(pj,qj)
    • When ij(ri,si)≠(rj,sj)

    Input

     

    The input is given from Standard Input in the following format:

    N K L
    p1 q1
    :
    pK qK
    r1 s1
    :
    rL sL
    

    Output

     

    Print N integers. The i-th of them should represent the number of the cities connected to the i-th city by both roads and railways.

    Sample Input 1

     

    4 3 1
    1 2
    2 3
    3 4
    2 3
    

    Sample Output 1

     

    1 2 2 1
    

    All the four cities are connected to each other by roads.

    By railways, only the second and third cities are connected. Thus, the answers for the cities are 1,2,2 and 1, respectively.

    Sample Input 2

     

    4 2 2
    1 2
    2 3
    1 4
    2 3
    

    Sample Output 2

     

    1 2 2 1
    

    Sample Input 3

     

    7 4 4
    1 2
    2 3
    2 5
    6 7
    3 5
    4 5
    3 4
    6 7
    

    Sample Output 3

     

    1 1 2 1 2 2 2


    题意:给一个无向无环图,边分为两种,一种是铁路,一种是公路。
    让求对于1~n中每一个节点i,有多少个节点和它是铁路和公路都联通的。(其中它自己也算,自己与自己一定是联通的。)
    思路:

    并查集
    ,我们对公路和铁路分成两个并查集来处理,如果一条公路把城市a到b联通,那么我们就合并a和b的集合,铁路同理。
    最后只需要处理下对于每一个节点i的公路和铁路的集合个数。

    细节见代码。
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <vector>
    #include <iomanip>
    #define ALL(x) (x).begin(), (x).end()
    #define rt return
    #define dll(x) scanf("%I64d",&x)
    #define xll(x) printf("%I64d
    ",x)
    #define sz(a) int(a.size())
    #define all(a) a.begin(), a.end()
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define pii pair<int,int>
    #define pll pair<long long ,long long>
    #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    #define MS0(X) memset((X), 0, sizeof((X)))
    #define MSC0(X) memset((X), '', sizeof((X)))
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define eps 1e-6
    #define gg(x) getInt(&x)
    #define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
    using namespace std;
    typedef long long ll;
    ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
    ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
    inline void getInt(int* p);
    const int maxn=1000010;
    const int inf=0x3f3f3f3f;
    /*** TEMPLATE CODE * * STARTS HERE ***/
    int par[maxn];
    int par2[maxn];
    int n;
    int m1,m2;
    void init()
    {
        repd(i,0,n)
        {
            par[i]=i;
            par2[i]=i;
        }
    }
    int findpar(int x)
    {
        return x==par[x]?x:par[x]=findpar(par[x]);
    }
    int findpar2(int x)
    {
        return x==par2[x]?x:par2[x]=findpar2(par2[x]);
    }
    void merg(int x,int y)
    {
        x=findpar(x);
        y=findpar(y);
        if(x!=y)
        {
            par[x]=y;
        }
    }
    void merg2(int x,int y)
    {
        x=findpar2(x);
        y=findpar2(y);
        if(x!=y)
        {
            par2[x]=y;
        }
    }
    std::vector<int> v[maxn];
    // std::vector<int> v2[];
    
    int main()
    {
        //freopen("D:\common_text\code_stream\in.txt","r",stdin);
        //freopen("D:\common_text\code_stream\out.txt","w",stdout);
        gg(n);
        gg(m1);
        gg(m2);
        init();// 并查集的预处理
        int a,b;
        repd(i,1,m1)
        {
            gg(a);
            gg(b);
    //        v[a].pb(b);
    //        v[b].push_back(a);
            merg(a,b);// 合并集合1
        }
        repd(i,1,m2)
        {
            gg(a);
            gg(b);
    //        v[a].pb(b);
    //        v[b].push_back(a);
            merg2(a,b);// 合并集合2
        }
        map<pii,int> ans;
        repd(i,1,n)
        {
    
            ans[mp(findpar(i),findpar2(i))]++;
    
        }
        repd(i,1,n)
        {
            cout<<ans[mp(findpar(i),findpar2(i))]<<" ";
        }
    
        return 0;
    }
    
    inline void getInt(int* p) {
        char ch;
        do {
            ch = getchar();
        } while (ch == ' ' || ch == '
    ');
        if (ch == '-') {
            *p = -(getchar() - '0');
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 - ch + '0';
            }
        }
        else {
            *p = ch - '0';
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 + ch - '0';
            }
        }
    }

    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    团队一手机便签一阶段互评
    课后作业-阅读任务-阅读笔记-3
    课后作业-阅读任务-阅读提问-3
    团队-手机便签-开发文档
    《结对-航空购票系统-结对项目总结》
    作业1 :四则运算
    自己设计大学排名--python数据库
    python文件读写笔记和我的第一个网站
    python我的一个爬虫和测试
    python:成绩雷达图和手绘图片
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/10603231.html
Copyright © 2011-2022 走看看