算法题(188):团伙

审题:

本题需要我们通过解析所有人之间的关系,从而判断出朋友团体的总个数并输出

思路:

方法一:扩展域并查集

由于这里涉及对朋友/敌人等关系集合的频繁操作,所以我们需要使用并查集来操作,但是普通的并查集只有一种集合域,也就是只能维护一种关系。这里有两种关系存在,常规并查集已经无法满足要求,所以我们需要使用扩展域并查集

补充:扩展域并查集

相比于普通并查集来说,这种并查集可以维护更多的关系,具体的实现逻辑如下

1.将fa数组的集合域分为朋友域和敌人域

朋友域为1~n,敌人域为1+n~n+n

2.对于x元素来说,和x在同一个集合的是朋友,和x+n在同一个集合的是敌人

讲解操作过程:

假设现在人数n为3,1和2是敌人,2和3是敌人。

接下来我们按照扩展域并查集的逻辑进行模拟操作

由于1和2是敌人,所以我们将1和2的敌人域连起来,将2和1的敌人域连起来,同理后面2和3也近似操作

按照题意,敌人的敌人就是朋友,所以1和3应该是朋友。而我们看到经过前面的操作,1和3处于同一个集合,满足题意,方法成立

解题:
 

#include<iostream>
using namespace std;
const int N = 1010;
int n, m;
int fa[N * 2];
int find(int x)
{return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void un(int x, int y)//让朋友域当根节点
{fa[find(x)] = find(y);
}int main()
{cin >> n >> m;//初始化扩展并查集for (int i = 1; i <= 2 * n; i++){fa[i] = i;}//建立关系for (int i = 1; i <= m; i++){char x;int y, z;cin >> x >> y >> z;if (x == 'E')//敌人关系{un(z + n, y);un(y + n, z);}else//朋友关系{un(y, z);}}//查询团伙数int ret = 0;for (int i = 1; i <= n; i++){if (fa[i] == i) ret++;}cout << ret << endl;return 0;
}

注意:

1.题目中只说了两个条件:一个是敌人的敌人是朋友,另一个是朋友的朋友是朋友。

但是没有说朋友的敌人是不是敌人,敌人的朋友是不是敌人,所以我们不需要进行特别的其他操作

2.由于实际上存在的人数是n,敌人域是我们自己构建的,所以我们最后统计团伙的时候不能统计到敌人域,只需要统计前n个即可

3.由于我们统计的是朋友域,所以我们的根节点一定要是朋友域的节点,否则就无法统计到了,在传参给un函数的时候要注意顺序

P1892 [BalticOI 2003] 团伙 - 洛谷

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

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

相关文章

C++开发/Qt开发:单例模式介绍与应用

单例模式是软件设计模式中最简单也是最常用的一种创建型设计模式。它的核心目标是确保一个类在整个应用程序生命周期中只有一个实例&#xff0c;并提供一个全局访问点。笔者白话版理解&#xff1a;你创建了一个类&#xff0c;如果你希望这个类对象在工程中应用时只创建一次&…

Linux笔记---策略模式与日志

1. 设计模式设计模式是软件开发中反复出现的问题的通用解决方案&#xff0c;它是一套套被反复使用、多数人知晓、经过分类编目的代码设计经验总结。设计模式并非具体的代码实现&#xff0c;而是针对特定问题的抽象设计思路和方法论。它描述了在特定场景下&#xff0c;如何组织类…

关于多个el-input的自动聚焦,每输入完一个el-input,自动聚焦到下一个

讲解原理或者思路&#xff1a;如果你有多个el-input,想要实现每输入完一个输入框&#xff0c;然后自动聚焦到下一个输入框&#xff0c;同理&#xff0c;如果每删除一个输入框的值&#xff0c;自动聚焦到上一个输入框。条件那么首先要做的就是&#xff0c;设置条件&#xff0c;在…

AI 赋能教育变革:机遇、实践与展望

引言说明教育在社会发展中的重要地位&#xff0c;以及传统教育面临的困境。引出 AI 技术为教育变革带来新机遇&#xff0c;阐述研究其在教育中应用的价值。AI 为教育带来的机遇个性化学习支持&#xff1a;讲解 AI 通过分析学生学习数据&#xff0c;如答题情况、学习时间等&…

(一)八股(数据库/MQ/缓存)

文章目录 项目地址 一、数据库 1.1 事务隔离级别 1. 事务的四大特性 2. Read Uncommited脏读(未提交读) 3. Read Commited幻读(sql默认已提交读) 4. Repeatable Read 5. Serializable 6. Snapshot(快照隔离) 7. 代码开启 8. For update和Repeatable Read的区别 1.2 各种锁 …

STM32H750 CoreMark跑分测试

STM32H750 CoreMark跑分测试&#x1f50e;CoreMark跑分测试查询网站&#xff1a;https://www.eembc.org/coremark/scores.php&#x1f4dc; CoreMark源码&#xff1a;https://www.github.com/eembc/coremarkCoreMark移植和配置参考&#xff1a;https://community.st.com/t5/stm…

RabbitMQ如何确保消息发送和消息接收

消息发送确认 1 ConfirmCallback方法 ConfirmCallback 是一个回调接口&#xff0c;消息发送到 Broker 后触发回调&#xff0c;确认消息是否到达 Broker 服务器&#xff0c;也就是只 确认是否正确到达 Exchange 中。 2 ReturnCallback方法 通过实现 ReturnCallback 接口&#xf…

Linux:进程间通信-管道

Linux&#xff1a;进程间通信-管道 前言&#xff1a;为什么需要进程间通信&#xff1f; 你有没有想过&#xff0c;当你在电脑上同时打开浏览器、音乐播放器和文档时&#xff0c;这些程序是如何协同工作的&#xff1f;比如&#xff0c;浏览器下载的文件&#xff0c;为什么能被文…

Jmeter + FFmpeg 直播压测遇到的问题及解决方案

1、压测机安装FFmpeg&#xff0c;下载安装步骤可见&#xff1a;https://zhuanlan.zhihu.com/p/692019886 2、Jmeter与FFmpeg位数要一致&#xff0c;不允许在32位的进程中运行一个64位的程序&#xff0c;反之亦然 3、OS进程取样器&#xff08;Thread Group -> Add -> Sa…

安卓app、微信小程序等访问多个api时等待提示调用与关闭问题

安卓app、微信小程序访问webapi&#xff0c;将需要一时间&#xff0c;我们称之为耗时操作&#xff0c;其它诸如密集型计算、访问文件与设备等亦是如此。在这个期间我们应该跳出提示&#xff0c;告知用户正在等待&#xff0c;并且很多时候&#xff0c;在等待时不允许用户再对UI进…

一个状态机如何启动/停止另一个状态机

一个状态机如何启动/停止另一个状态机 这个过程主要依赖于动作列表&#xff08;Action List&#xff09; 中的特定动作项和状态管理服务&#xff08;ARA::SM&#xff09;提供的API。 1. 通过动作列表&#xff08;Action List&#xff09;进行预配置控制 这是最常见的方式&#…

基于IPO智能粒子优化的IIR滤波器参数识别算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.完整程序 1.程序功能描述 IIR&#xff08;Infinite Impulse Response&#xff09;滤波器即无限冲激响应滤波器&#xff0c;其输出不仅与当前和过去的输入有关&#xff0c;还与过去的输出…

欧州服务器String 转 double 有BUG?

string 转 double 的常见问题通常与文化差异、格式解析或特殊值处理相关&#xff0c;而非框架本身的 “BUG”。以下是可能导致转换异常的常见场景及解决方案&#xff1a; 文化差异导致的解析问题 现象&#xff1a;同样的字符串&#xff08;如 “1.23” 或 “1,23”&#xff09;…

鸿蒙中网络诊断:Network分析

上面的图很熟悉吧 Network 面板的表格列出了所有请求&#xff0c;每一列都提供了关键信息&#xff1a; Name: 请求的资源名称和路径。 Status: HTTP 状态码&#xff08;诊断核心&#xff09;。200成功&#xff0c;304未修改&#xff08;缓存&#xff09;&#xff0c;404找不到…

HarmonyOS 实战:6 种实现实时数据更新的方案全解析(含完整 Demo)

摘要 在当下的应用开发中&#xff0c;用户体验越来越依赖“实时性”。消息要第一时间送达、订单状态要立刻刷新、数据变化不能延迟……这些需求推动了“实时数据更新”成为应用的必备功能。在鸿蒙系统&#xff08;HarmonyOS&#xff09;中&#xff0c;我们既可以用系统内置的数…

第十六届蓝桥杯青少组C++省赛[2025.8.10]第二部分编程题(4、矩阵圈层交错旋转)

参考程序&#xff1a;#include <bits/stdc.h> using namespace std;const int MAXN 105; int a[MAXN][MAXN];int main() {int n;if (!(cin >> n)) return 0;for (int i 0; i < n; i)for (int j 0; j < n; j)cin >> a[i][j];int layers n / 2; // 每…

AI供应链情报预警 | 恶意Py包伪装AI框架库开展数据窃密及应用劫持攻击

AI供应链情报概述近日&#xff08;18th Aug. , 2025&#xff09;&#xff0c;悬镜安全情报中心在Python官方仓库中捕获1起伪装成知名AI框架库pytensor&#xff08;https://pypi.org/project/pytensor&#xff09;的组件投毒事件。在北京时间8月18日凌晨&#xff0c;投毒者连续发…

AI需要防火墙,云计算需要重新构想

Akamai创始人Tom Leighton欲终结云膨胀&#xff0c;从内到外守护AI安全 Akamai创始人Tom Leighton 当前超大规模云服务商主导着企业IT市场&#xff0c;鲜有人敢挑战云计算经济模式、AI基础设施和网络安全架构的现状。但Akamai联合创始人兼CEO Tom Leighton正是这样的挑战者。他…

线段树详解【数据结构】

简介 线段树是一种应用极其广泛&#xff0c;使用范围较广并且非常知名的树形数据结构&#xff0c;主要用于进行区间操作&#xff0c;如区间修改&#xff0c;区间查询等。这种数据结构唯一的不足就是巨大的代码量&#xff0c;因此处理一些较简单的问题时建议用树状数组。 原理…

Maven 入门与进阶:聚合、继承与生命周期详解

Maven 是 Java 项目管理的核心工具&#xff0c;其强大的依赖管理、项目构建和模块化设计能力&#xff0c;极大地提升了开发效率。本文将深入探讨 Maven 的 聚合&#xff08;Multi-module&#xff09;、继承&#xff08;Inheritance&#xff09; 和 生命周期&#xff08;Lifecyc…