二分图建图,并查集求联通——二维等价性传递 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; }