Problem Statement

 

There are <var>N</var> cities. There are also <var>K</var> roads and <var>L</var> railways, extending between the cities. The <var>i</var>-th road bidirectionally connects the <var>pi</var>-th and <var>qi</var>-th cities, and the <var>i</var>-th railway bidirectionally connects the <var>ri</var>-th and <var>si</var>-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 <var>A</var> and <var>B</var> are connected by roads if city <var>B</var> is reachable from city <var>A</var>by 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

 

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

Input

 

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

<var>N</var> <var>K</var> <var>L</var>
<var>p1</var> <var>q1</var>
:
<var>pK</var> <var>qK</var>
<var>r1</var> <var>s1</var>
:
<var>rL</var> <var>sL</var>

Output

 

Print <var>N</var> integers. The <var>i</var>-th of them should represent the number of the cities connected to the <var>i</var>-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 <var>1,2,2</var> and <var>1</var>, 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\n",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), '\0', 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 == '\n');
    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';
        }
    }
}