AtcoderARC065D并查集加map,pair

https://atcoder.jp/contests/arc065/tasks/arc065_b

给你n个城市,k条铁路,k条公路,每个城市连着一些铁路,一些公路,问你对于每个城市,即可以通过铁路又可以通过公路到达它的城市数目(包括自身)

直接两遍并查集,map存两个祖先的pair,最后输出map的结果即可

#include
#include
#include
#include
#define maxn 200005
using namespace std;
int n,k,l;
int father1[maxn];
int father2[maxn];
map,int>mp;
int find1(int x)
{
    if(father1[x]!=x)
       father1[x]=find1(father1[x]);
    return father1[x];
}
int find2(int x)
{
    if(father2[x]!=x)
        father2[x]=find2(father2[x]);
    return father2[x];
}
void unionn1(int x,int y)
{
    int fa=find1(x);
    int fb=find1(y);
    if(fa!=fb)
        father1[fa]=fb;
}
void unionn2(int x,int y)
{
    int fa=find2(x);
    int fb=find2(y);
    if(fa!=fb)
        father2[fa]=fb;
}
int main()
{scanf("%d%d%d",&n,&k,&l);
for(int i=0;i<=n;i++)
    {father1[i]=i;
    father2[i]=i;
    }
int p,q;
for(int i=1;i<=k;i++)
{scanf("%d%d",&p,&q);
    unionn1(p,q);
}
int r,s;
for(int i=1;i<=l;i++)
{scanf("%d%d",&r,&s);
unionn2(r,s);
}
for(int i=1;i<=n;i++)
mp[make_pair(find1(i),find2(i))]++;
for(int i=1;i<=n;i++)
    if(i!=n)
    printf("%d ",mp[make_pair(find1(i),find2(i))]);
else
    printf("%d\n",mp[make_pair(find1(i),find2(i))]);
return 0;
}

 

你可能感兴趣的:(并查集)