给你一个 (n imes m) 的矩形,一开始有 (q) 个格子上被标记。对于任意两行两列,如果交汇的四个格子中有三个被标记,那么第 (4) 个会被自动标记。问你至少需要手动标记几个格子,使得整个矩形内的格子都被标记。
Solution
行和列分别对应二分图的左部右部,格子对应边,那么我们只需要手动使得二分图连通,通过自动标记的操作就可以得到完全二分图
于是答案为连通块数量 (-1)
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n,m,k,t1,t2,fa[N];
int find(int p) {
return p==fa[p]?p:fa[p]=find(fa[p]);
}
void merge(int p,int q) {
p=find(p); q=find(q);
if(p-q) fa[p]=q;
}
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m>>k;
for(int i=1;i<=n+m;i++) fa[i]=i;
for(int i=1;i<=k;i++) {
cin>>t1>>t2;
merge(t1,t2+n);
}
int ans=0;
for(int i=1;i<=n+m;i++) if(find(i)==i) ++ans;
cout<<ans-1;
}