题目背景
小明在 A 公司工作,小红在 B 公司工作。
题目描述
这两个公司的员工有一个特点:一个公司的员工都是同性。
A 公司有 N 名员工,其中有 P 对朋友关系。B 公司有 M 名员工,其中有 Q 对朋友关系。朋友的朋友一定还是朋友。
每对朋友关系用两个整数 (Xi,Yi) 组成,表示朋友的编号分别为 Xi,Yi。男人的编号是正数,女人的编号是负数。小明的编号是 1,小红的编号是 −1。
大家都知道,小明和小红是朋友,那么,请你写一个程序求出两公司之间,通过小明和小红认识的人最多一共能配成多少对情侣(包括他们自己)。
输入格式
输入的第一行,包含 4 个空格隔开的正整数 N,M,P,Q。
之后P 行,每行两个正整数 Xi,Yi。
之后 Q 行,每行两个负整数 Xi,Yi。
输出格式
输出一行一个正整数,表示通过小明和小红认识的人最多一共能配成多少对情侣(包括他们自己)。
输入输出样例
输入 #1复制
4 3 4 2 1 1 1 2 2 3 1 3 -1 -2 -3 -3输出 #1复制
2说明/提示
对于 100% 的数据 N,M≤104,P,Q≤2×104。
并查集,对于两个公司分别进行操作,然后分别找和1,-1这两个数有关的其他数,少的那个就是答案
#include <iostream>
#include <cmath>
using namespace std;
constexpr int N=1e5+7;
int fa1[N],fa2[N];
int getf1(int x){
return x==fa1[x] ? x:fa1[x]= getf1(fa1[x]);
}
int getf2(int x){
return x==fa2[x] ? x:fa2[x]= getf2(fa2[x]);
}
void unite1(int x,int y){
fa1[getf1(x)]= getf1(y);
}
void unite2(int x,int y){
fa2[getf2(x)]= getf2(y);
}
int main(){
int n,m,p,q;
int ans1=0,ans2=0;
scanf("%d%d%d%d",&n,&m,&p,&q);
for(int i=0;i<=n;i++){
fa1[i]=i;
}
for(int i=0;i<=m;i++){
fa2[i]=i;
}
for(int i=1;i<=p;i++){
int u,v;
scanf("%d%d",&u,&v);
unite1(u,v);
}
for(int i=1;i<=q;i++){
int u,v;
scanf("%d%d",&u,&v);
u= abs(u);
v= abs(v);
unite2(u,v);
}
for(int i=1;i<=n;i++){
if(getf1(i)==getf1(1)){
ans1++;
}
}
for(int i=1;i<=m;i++){
if(getf2(i)==getf2(1)){
ans2++;
}
}
printf("%d", min(ans1,ans2));
}