标签:联通 int d% CodeForces 二元关系 1013D fa 题目 Vjudge20220416
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。