20分并查集求调
  • 板块P2078 朋友
  • 楼主pengzixiang
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/2/13 19:09
  • 上次更新2023/10/24 00:52:45
查看原帖
20分并查集求调
587261
pengzixiang楼主2023/2/13 19:09
#include <iostream>

using namespace std;
const int N=1e4+5;
int n,m,p,q,a[N],b[N],x,y;
int get1(int x){
    if(x!=a[x]){
        a[x]=get1(a[x]);
        return a[x];
    }
    return x;
}
int get2(int x){
    if(x!=b[x]){
        b[x]=get2(b[x]);
        return a[x];
    }
    return x;
}
int main()
{
    cin >> n >> m >> p >> q;
    for(int i=1;i<=n;i++) a[i]=i;
    for(int i=1;i<=m;i++) b[i]=i;

    for(int i=1;i<=p;i++){
        cin >> x >> y;
        if(get1(x)!=get1(y)){
            a[get1(x)]=get1(y);
        }
    }
    for(int i=1;i<=q;i++){
        cin >> x >> y;
        x=-x;
        y=-y;
        if(get2(x)!=get2(y)){
            b[get2(x)]=get2(y);
        }
    }
    int cnt1=0,cnt2=0;

    for(int i=1;i<=n;i++){
        if(get1(1)==get1(i)) cnt1++;
    }
    for(int i=1;i<=m;i++){
        if(get2(1)==get2(i)) cnt2++;
    }
    printf("%d",min(cnt1,cnt2));
    return 0;
}

2023/2/13 19:09
加载中...