[Luogu-CF1012B] 还有重题 P5089[eJOI2018]元素周期表
题解原话 : 可以发现这个过程是不改变二分图中的连通分量的个数的
答案就是 连通分量数-1
证明 : 设一行或一列为一个点,每一个单独的行或列都可以通过一次操作搞满
#include<bits/stdc++.h>
int n,m,q,x,y,S;
int v[400001];
int h[400001],nxt[400001],to[400001],tot;
inline void ins(int x,int y){nxt[++tot]=h[x];to[tot]=y;h[x]=tot;}
void D(int u){
for(int i=h[u];i;i=nxt[i])if(!v[to[i]])
v[to[i]]=1, D(to[i]);
}
int main(){
scanf("%d%d%d",&n,&m,&q);
while(q--) scanf("%d%d",&x,&y), ins(x,n+y), ins(n+y,x);
for(int i=1;i<=n+m;++i) if(!v[i]) ++S, v[i]=1, D(i);
printf("%d",S-1);
return 0;
}