朋友

news/2024/11/28 12:44:41/文章来源:https://www.cnblogs.com/gailixia/p/18571261

朋友

题目背景

小明在 A 公司工作,小红在 B 公司工作。

题目描述

这两个公司的员工有一个特点:一个公司的员工都是同性。

A 公司有 \(N\) 名员工,其中有 \(P\) 对朋友关系。B 公司有 \(M\) 名员工,其中有 \(Q\) 对朋友关系。朋友的朋友一定还是朋友。

每对朋友关系用两个整数 \((X_i,Y_i)\) 组成,表示朋友的编号分别为 \(X_i,Y_i\)。男人的编号是正数,女人的编号是负数。小明的编号是 \(1\),小红的编号是 \(-1\)

大家都知道,小明和小红是朋友,那么,请你写一个程序求出两公司之间,通过小明和小红认识的人最多一共能配成多少对情侣(包括他们自己)。

输入格式

输入的第一行,包含 \(4\) 个空格隔开的正整数 \(N,M,P,Q\)

之后 \(P\) 行,每行两个正整数 \(X_i,Y_i\)

之后 \(Q\) 行,每行两个负整数 \(X_i,Y_i\)

输出格式

输出一行一个正整数,表示通过小明和小红认识的人最多一共能配成多少对情侣(包括他们自己)。

样例

样例输入

4 3 4 2
1 1
1 2
2 3
1 3
-1 -2
-3 -3

样例输出

2

提示

对于 \(30 \%\) 的数据,\(N,M \le 100\)\(P,Q \le 200\)

对于 \(80 \%\) 的数据,\(N,M \le 4 \times 10^3\)\(P,Q \le 10^4\)

对于 \(100 \%\) 的数据,\(N,M \le 10^4\)\(P,Q \le 2 \times 10^4\)

[!TIP]

并查集

#include <bits/stdc++.h>
using namespace std;
const int N = 2e4 + 10;
int n, m, p, q, x, y;
int f[N], g[N];// 查找函数
int find1(int x) {if (f[x] == x) {return x;} else {return f[x] = find1(f[x]);}
}
int find2(int x) {if (g[x] == x) {return x;} else {return g[x] = find2(g[x]);}
}// 合并函数
void baka1(int x, int y) {int findX = find1(x);int findY = find1(y);if (findX != findY) {f[findX] = findY;}
}void baka2(int x, int y) {int findX = find2(x);int findY = find2(y);if (findX != findY) {g[findX] = findY;}
}int main() {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++) {g[i] = i;}//合并Afor (int i = 0; i < p; i++) {scanf("%d %d", &x, &y);baka1(x, y);}//合并Bfor (int i = 0; i < q; i++) {scanf("%d %d", &x, &y);baka2(-x, -y); // B公司员工性别为女,编号为负,要取反}}int FFF1 = 0, FFF2 = 0;//FFF是单身狗最后的倔强for (int i = 1; i <= n; i++) {if (find1(i) == find1(1)) {FFF1++;}}for (int i = 1; i <= m; i++) {if (find2(i) == find2(1)) {FFF2++;}}printf("%d\n", min(FFF1, FFF2));return 0;
}

我们也可以通过定义fumo来区分,从而合并find 和 baka

#include <bits/stdc++.h>
using namespace std;
const int N = 2e4 + 10;
int n, m, p, q, x, y;
int f[N], g[N];// 查找函数
int find(int x, int fumo) {if (fumo == 1) {if (f[x] == x) {return x;} else {return f[x] = find(f[x], fumo);}} else if (fumo == 2) {if (g[x] == x) {return x;} else {return g[x] = find(g[x], fumo);}}
}// 合并函数(用fumo区分AB)
void baka(int x, int y, int fumo) {int findX = find(x, fumo);int findY = find(y, fumo);if (findX!= findY) {if (fumo == 1) {//Af[findX] = findY;} else if (fumo == 2) {//Bg[findX] = findY;}}
}int main() {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++) {g[i] = i;}// 合并Afor (int i = 0; i < p; i++) {scanf("%d %d", &x, &y);baka(x, y, 1);}// 合并Bfor (int i = 0; i < q; i++) {scanf("%d %d", &x, &y);baka(-x, -y, 2); //B公司员工性别为女,编号为负,要取反}// 统计与小明(1)和小红(反1)的朋友关系数量int FFF1 = 0, FFF2 = 0;//定义为FFF是单身狗最后的倔强for (int i = 1; i <= n; i++) {if (find(i, 1) == find(1, 1)) {FFF1++;}}for (int i = 1; i <= m; i++) {if (find(i, 2) == find(1, 2)) {FFF2++;}}printf("%d\n", min(FFF1, FFF2));return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/841930.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang网络模型netpoll源码解析

0、引言 在学习完了Socket编程的基础知识、Linux系统提供的I/O多路复用的实现以及Golang的GMP调度模型之后,我们进而学习Golang的网络模型——netpoll。本文将从为什么需要使用netpoll模型,以及netpoll的具体流程实现两个主要角度来展开学习。当前使用的Go的版本为1.22.4,Li…

骁龙 8 Elite 至尊版 对比 电脑端cpu

台式/笔记本 参考https://socpk.com/cpu/ 骁龙 8 Elite是260 M4 (4+6) 是360而M4对比笔记本cpu参考

线性版本HierHolzer正确性说明

晚上在研究怎么求欧拉图回路,看到 \(O(n+m)\) 版本的 HierHolzer 算法实现,让我很迷惑。 void dfs(int x){for(int i = 1;i <= 500; ++i){if(g[x][i]){--g[x][i]; --g[i][x];dfs(i);}}ans[++cnt] = x; }OI-Wiki 上对于这段代码的描述是这样的:将找回路的 DFS 和 Hierholz…

plus_one

2024/11/26 --2024/11/28 验证哥德巴赫猜想 打印漏斗 1.统计字符 1. 不需要数组,在循环中统计各个种类的字符 2. 一定把各个种类初始化为0 3. 一个一个字符输入,不是字符串一次输入哦 4. 空格是 回车是 \n 5. 大小写字母的ASCII码不连续,所以是(s >= a&& s<…

Python基础语法 11月22日到11月26日学习过程

Python的环境配置 python安装安装地址官网网址:https://www.python.org 华为云镜像站地址:https://mirrors.huaweicloud.com/homepython根目录介绍根目录截图python的根目录【安装目录】:D:\soft\Python37Scriptspip # 从python官网上下载第三方的库 pip3.7 pip3Lib # py…

快速搭建和访问 FTP 服务器

随着以 minio 为代表的分布式系统的广泛应用,使用 FTP 的场景就越来越少了,目前仍然在一些简单的应用场景中使用。 本篇博客使用 fauria/vsftpd 的 docker 镜像,介绍 FTP 服务器搭建的两种方式:匿名访问方式 和 使用账号密码访问方式。然后使用 SpringBoot 程序通过代码访问…

Beta阶段——第十周Scrum Meeting记录

1.目前进度: (1)实现沙盒模式,基础逻辑门组件的搭建功能; (2)组件的增加,移动,旋转,删除; (3)逻辑电路的布线及删除; (4)高低电平测试;2.目前团队中存在的问题: (1)前期未能很好的使用Github仓库,导致工作进度难以同步; (2)大多数成员对Unity和C#编程语…

从软件工程的角度,谈模块为什么总是不兼容

前言 今天刚刷上Apatch,发现其没有提供Zygisk,又去酷安搜了一搜,似乎有人反应刷Lsposed不起作用,大致了解了一下,并查了些资料。下面我开始猜测以及进行理论。 说是从软件工程出发,但是实际上我并不算一个好学生,更无法代表软件工程,这或许很标题党,但是我确实想以这个…

uml用例图-2024/11/26

超市进销存管理系统

MySQL报错:sql_mode=only_full_group_by解决方法

MySQL报错:sql_mode=only_full_group_by解决方法 登录mysql之后,执行命令查看当前的sql_mode配置 select @@global.sql_mode;​​ 可以发现MySQL的sql_mode是开启了ONLY_FULL_GROUP_NY。 解决方法 把 sql_mode 中的 ONLY_FULL_GROUP_NY​去掉,其他不变即可。 找到MySQL的配置…

使用Lombok导致打印的tostring中缺少父类的属性

背景 实体类UserDto extends BaseEntity,两个类的上方都有标注,Lombok的@Data注解,但是使用时UserDto的实例对象调用toString方法时发现,只打印出来自身子类的属性信息,并没有打印出来父类的信息。@Data public class UserDto extends BaseEntity { /*** 姓名*/@TableFiel…

20222322 2024-2025-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1实验要求 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取相关信息。 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并查询获取该好友所在的具体地理位置。 (3)使用nmap开源软件对靶机环境进行扫描,回答以下问题并给…