朋友
一道简单的并查集模板题。。。
题目背景
小明在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。
输出格式:一行,一个正整数,表示通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)
输入输出样例
说明
对于30%数据,N,M<=100,P,Q<=200
对于80%数据,N,M<=4000,P,Q<=10000.
对于全部数据,N,M<=10000,P,Q<=20000。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int f[10001],m[10001]; int bb(int a) { while(f[a]!=a)a=f[a]; return a; } int mb(int a) { while(m[a]!=a)a=m[a]; return a; } int main() { int N,M,P,Q,r1,r2,numa=0,numb=0; scanf("%d%d%d%d",&N,&M,&P,&Q); for(int i=1;i<=N;i++) f[i]=i; for(int i=1;i<=M;i++) m[i]=i; while(P--) { cin>>r1>>r2; f[bb(r2)]=bb(r1); } while(Q--) { cin>>r1>>r2; m[mb(-r2)]=mb(-r1); } for(int i=1;i<=N;i++) { if(bb(i)==bb(1)) numa++; } for(int i=1;i<=M;i++) { if(mb(i)==mb(1)) numb++; } cout<<min(numa,numb); }