其他分享
首页 > 其他分享> > Vjudge20220416练习9 C CodeForces - 1013D

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