二分图建图,并查集求联通——二维等价性传递 cf1012B好题!

/*
模拟二分图:每个点作为一条边,连接的是一列和一行(抽象成一个点,列在左,行在右)
由题意得 a-b相连,a-c相连,b-d相连,那么d-c就不用再相连了
等价于把二分图变成联通的需要再加多少边
用并查集可以解决 
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 400005
int F[maxn],n,m,q;
int find(int x){
    return F[x]==x?x:F[x]=find(F[x]);
}
void bing(int a,int b){
    int t1=find(a),t2=find(b);
    if(t1!=t2)
        F[t1]=t2;
}
int main(){
    cin>>n>>m>>q;
    for(int i=1;i<=n+m;i++)F[i]=i;
    while(q--){
        int u,v;
        cin>>u>>v;
        v+=n;
        bing(u,v);
    }
    int ans=0;
    for(int i=1;i<=n+m;i++)
        if(find(F[i])==i)ans++;
    cout<<ans-1;
}
 

 

posted on 2019-05-31 12:35  zsben  阅读(219)  评论(0编辑  收藏  举报

导航