Vjudge20220416练习9 C CodeForces - 1013D
作者:互联网
written on 2022-04-22
这是一道很有价值的题目,也是同类型题目中一道基础题
题目所给条件可以转化为:
给定(a,c),(a,d),(b,c) 那么(b,d)自动出现
这些都是二元关系,二元关系一多,就是暗示我们要考虑建图。那么想象现在有四个点 \(a\) , \(b\) , \(c\) , \(d\) ,现在有一些无向边使它们构成了一个联通块(四个点只要三条边就能使之变成一个联通块),这是(b,d)这条边就是没必要加的边
有n行m列,那么就可以视为有n+m个点,目标即为将所有的点变到一个联通块中最少需要加的边数。那么我们用并查集来维护这些联通块,最后的答案即为联通块个数减一
#include<bits/stdc++.h>
#define N 400005
using namespace std;
int n,m,k;
int fa[N];
int get(int x){return x==fa[x]?x:fa[x]=get(fa[x]);}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m+n;i++) fa[i]=i;
while(k--)
{
int x,y;
scanf("%d%d",&x,&y);
fa[get(x)]=get(y+n);
}
int ans=-1;
for(int i=1;i<=m+n;i++) ans+=get(i)==i;
printf("%d",ans);
}
标签:联通,int,d%,CodeForces,二元关系,1013D,fa,题目,Vjudge20220416 来源: https://www.cnblogs.com/Freshair-qprt/p/16537702.html