题目背景
小明在 A 公司工作,小红在 B 公司工作。
题目描述
这两个公司的员工有一个特点:一个公司的员工都是同性。
A 公司有 N N 名员工,其中有 P P 对朋友关系。B 公司有 M M 名员工,其中有 Q Q 对朋友关系。朋友的朋友一定还是朋友。
每对朋友关系用两个整数 (X_i,Y_i)( Xi, Yi) 组成,表示朋友的编号分别为 X_i,Y_i Xi, Yi。男人的编号是正数,女人的编号是负数。小明的编号是 11,小红的编号是 -1−1。
大家都知道,小明和小红是朋友,那么,请你写一个程序求出两公司之间,通过小明和小红认识的人最多一共能配成多少对情侣(包括他们自己)。
输入格式
输入的第一行,包含 44 个空格隔开的正整数 N,M,P,Q N, M, P, Q。
之后 P P 行,每行两个正整数 X_i,Y_i Xi, Yi。
之后 Q Q 行,每行两个负整数 X_i,Y_i Xi, Yi。
输出格式
输出一行一个正整数,表示通过小明和小红认识的人最多一共能配成多少对情侣(包括他们自己)。
输入输出样例
输入 #1复制
4 3 4 2 1 1 1 2 2 3 1 3 -1 -2 -3 -3
输出 #1复制
2
说明/提示
对于 30 \%30% 的数据,N,M \le 100 N, M≤100,P,Q \le 200 P, Q≤200;
对于 80 \%80% 的数据,N,M \le 4 \times 10^3 N, M≤4×103,P,Q \le 10^4 P, Q≤104;
对于 100 \%100% 的数据,N,M \le 10^4 N, M≤104,P,Q \le 2 \times 10^4 P, Q≤2×104。
该题貌似出现了两个不相干的大集合A和B,但是仔细想想它们之间是有联系的,因为A公司的小明和B公司的小红他们是朋友并且题目中说朋友的朋友也是朋友,所以A和B公司可以看作一个大集体。
因为B公司的m位女同胞都是用负数表示,但我们可以将B公司女同胞的序号加在A公司n个男同胞的后面,也就是:-1*这个女同胞的序号+n。
然后将p对男性朋友互相连通,q对女性朋友互相连通。
最后看一下A公司小明有多少朋友,B公司小红有多少朋友,然后输出朋友少的那个人的朋友数,代表可以凑成对的数量,毕竟找对象还是要一对一,多出来的人只能单着。
#include"stdio.h"
int f[50000];
int find(int v)
{
if(f[v]==v) return v;
else
{
f[v]=find(f[v]);
return f[v];
}
}
void hb(int v,int u)
{
int t1,t2;
t1=find(v);
t2=find(u);
if(t1!=t2)
{
f[t2]=t1;
}
}
main()
{
int n,m,p,q,x,y;
int i,sum1=0,sum2=0;
scanf("%d %d %d %d",&n,&m,&p,&q);
for(i=1;i<=n+m;i++)
f[i]=i;
for(i=1;i<=p;i++)
{
scanf("%d %d",&x,&y);
hb(x,y);
}
for(i=1;i<=q;i++)
{
scanf("%d %d",&x,&y);
hb(-1*x+n,-1*y+n);
}
for(i=1;i<=n;i++)
if(find(f[i])==find(f[1])) sum1++;
for(i=n+1;i<=n+m;i++)
if(find(f[i])==find(f[n+1])) sum2++;
if(sum1>sum2) printf("%d",sum2);
else printf("%d",sum1);
}