P2078朋友

文章描述了一个编程问题,涉及两个公司的员工,其中所有员工分属同性别的两个群体。小明和小红是朋友,连接两个公司。给定每个公司的朋友关系,任务是计算通过他们最多能形成多少对情侣。解决方案包括合并两个公司的朋友网络并找出与小明和小红连接的朋友数量,较少的那个数量即为答案。
摘要由CSDN通过智能技术生成
题目背景
小明在 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。
  1. 该题貌似出现了两个不相干的大集合A和B,但是仔细想想它们之间是有联系的,因为A公司的小明和B公司的小红他们是朋友并且题目中说朋友的朋友也是朋友,所以A和B公司可以看作一个大集体。

  1. 因为B公司的m位女同胞都是用负数表示,但我们可以将B公司女同胞的序号加在A公司n个男同胞的后面,也就是:-1*这个女同胞的序号+n。

  1. 然后将p对男性朋友互相连通,q对女性朋友互相连通。

  1. 最后看一下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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值