题目:给你n*m的区域,q个格子放上了标记,如上图放了(r1,c1),(r1,c2),(r2,c1)后(r2,c2)就可以自动出来标记,问让最后所有的格子都被标记还需要的最小标记数。
思路:假设没有一个格子放有标记。下图还需放n+m-1个标记,能把所有的格子标记完。此时是最优的
然后把q个多放的格子放进去等效替换就可以啦,并查集去重。
#include <bits/stdc++.h>
using namespace std;
const int maxn=4e5+100;
int n,m,q,fa[maxn];
int findfa(int x)
{
if(x==fa[x])return x;
int y=x,tmp;
while(x!=fa[x]) x=fa[x];
while(fa[y]!=x)
{
int tmp=fa[y];
fa[y]=x;
y=tmp;
}
return x;
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n+m;i++)
fa[i]=i;
int ans=n+m-1;
while(q--)
{
int x,y,fx,fy;
scanf("%d%d",&x,&y);
y+=n;
fx=findfa(x);
fy=findfa(y);
if(fx!=fy)
{
fa[fx]=fy;
ans--;
}
}
printf("%d\n",ans);
return 0;
}