[CF1012B] Chemical table

给你一个 (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;
}
原文地址:https://www.cnblogs.com/mollnn/p/12584878.html