题解 LuoguP2078 【朋友】

并查集模板题。

求出\(min(\)小明所在集合人数\(,\)小红所在集合人数\()\)即可。

\(Code:\)

#pragma GCC diagnostic error "-std=c++11"
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
template<class T>void r(T &a)
{
    T s=0,w=1;a=0;char ch=getc(stdin);
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getc(stdin);}
    while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getc(stdin);}
    a=w*s;
}
template<class T,class... Y>void r(T& t,Y&... a){r(t);r(a...);}
struct bcj
{
    int father[10010];
    void start(int n)
    {for(int i=0;i<=n;i++)father[i]=i;}
    int find(int x)
    {if(father[x]!=x)father[x]=find(father[x]);return father[x];}
    void unionn(int x,int y)
    {x=find(x);y=find(y);if(x!=y)father[y]=x;}
    bool judge(int x,int y)
    {if(find(x)==find(y))return true;return false;}
};
bcj man,woman;
int main()
{
    int n,m,p,q,ans1=0,ans2=0;
    r(n,m,p,q);
    man.start(n);
    woman.start(m);
    for(int i=1;i<=p;i++)
    {
        int x,y;
        r(x,y);
        man.unionn(x,y);
    }
    for(int i=1;i<=q;i++)
    {
        int x,y;
        r(x,y);
        woman.unionn(-x,-y);
    }
    for(int i=1;i<=n;i++)
        if(man.judge(1,i))ans1++;
    for(int i=1;i<=m;i++)
        if(woman.judge(1,i))ans2++;
    printf("%d\n",min(ans1,ans2));
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Naive-Cat/p/10664191.html