【洛谷 2078】朋友
题目背景
小明在A公司工作,小红在B公司工作。
题目描述
这两个公司的员工有一个特点:一个公司的员工都是同性。
A公司有N名员工,其中有P对朋友关系。B公司有M名员工,其中有Q对朋友关系。朋友的朋友一定还是朋友。
每对朋友关系用两个整数(Xi,Yi)组成,表示朋友的编号分别为Xi,Yi。男人的编号是正数,女人的编号是负数。小明的编号是1,小红的编号是-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
说明/提示
对于30%数据,N,M<=100,P,Q<=200
对于80%数据,N,M<=4000,P,Q<=10000.
对于全部数据,N,M<=10000,P,Q<=20000。
题解:就求男生有多少个和1认识,女生有多少人和-1认识,然后整合一下
取两者直接取小的即可。(毕竟不可一夫多妻或一妻多夫hhh)
#include<iostream> #include<algorithm> #include<queue> #include<cmath> #include<cstring> #include<cstdlib> #include<cstdio> using namespace std; const int N=20005; int n,m,p,q,x,y,a1,a2; int fa1[N],fa2[N],ans1,ans2; int find1(int x){ if(fa1[x]==x) return x; return fa1[x]=find1(fa1[x]); } int find2(int x){ if(fa2[x]==x) return x; return fa2[x]=find2(fa2[x]); } int main(){ scanf("%d %d %d %d",&n,&m,&p,&q); for(int i=1;i<=n;i++) fa1[i]=i; for(int i=1;i<=m;i++) fa2[i]=i; for(int i=1;i<=p;i++){ scanf("%d %d",&x,&y); a1=find1(x); a2=find1(y); if(a1!=a2) fa1[a2]=a1; } for(int i=1;i<=q;i++){ scanf("%d %d",&x,&y); x=-x; y=-y; a1=find2(x); a2=find2(y); if(a1!=a2) fa2[a2]=a1; } for(int i=1;i<=n;i++) if(find1(i)==find1(1)) ans1++; for(int i=1;i<=m;i++) if(find2(i)==find2(1)) ans2++; printf("%d",min(ans1,ans2)); return 0; }