news 2026/6/10 15:44:59

洛谷 P1892 [BalticOI 2003] 团伙 简单并查集 做法 题解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷 P1892 [BalticOI 2003] 团伙 简单并查集 做法 题解

题目描述:

现在有 n 个人,他们之间有两种关系:朋友和敌人。我们知道:

  • 一个人的朋友的朋友是朋友
  • 一个人的敌人的敌人是朋友

现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。

输入格式

第一行输入一个整数 n 代表人数。

第二行输入一个整数 m 表示接下来要列出 m 个关系。

接下来 m 行,每行一个字符 opt 和两个整数 p,q,分别代表关系(朋友或敌人),有关系的两个人之中的第一个人和第二个人。其中 opt 有两种可能:

  • 如果 opt 为F,则表明 p 和 q 是朋友。
  • 如果 opt 为E,则表明 p 和 q 是敌人。

输出格式

一行一个整数代表最多的团体数。

输入输出样例

输入 #1复制

6 4 E 1 4 F 3 5 F 4 6 E 1 2

输出 #1复制

3

说明/提示

对于 100% 的数据,2≤n≤1000,1≤m≤5000,1≤p,q≤n。

思路:

题目简单来说就是给出几对关系,有朋友关系也有敌对关系,要我们输出最终团体的数量。看到这种说两两关系的题我们可以想到用并查集来做,按题目的说法我们可以知道朋友的敌人的朋友就是敌人,敌人的敌人是朋友,都是朋友说明在一个团体。那么我们可以考虑扩展两倍n,做一个虚拟节点(n+1~2n)的操作,一半朋友,一半敌人,也就是n*2。然后是朋友就正常合并他们为一个团体(合并(x,y)),否则就是敌对,那么有"一对"关系,也就是x讨厌y,y讨厌x,那么我们可以进行两个合并,即合并(x+n,y),合并(y+n,x)。最后统计1到n的根节点数量,也就是团体数量,也就是答案。

举个例子:

假设n=2m=1,操作是E 1 2(1 和 2 是敌人)。

  1. 初始化:saki[1]=1, saki[2]=2, saki[3]=3, saki[4]=4
  2. 执行he(1+2, 2)he(3, 2),此时saki[fin(3)] = fin(2)saki[2] = 2(3 的根变成 2)
  3. 执行he(2+2, 1)he(4, 1),此时saki[fin(4)] = fin(1)saki[1] = 1(4 的根变成 1)

主播的代码(参考):

#include <iostream> #include<queue> #include<algorithm> #include<map> #include<vector> #include<set> #include<stack> #include<string> #include<math.h> #include <iomanip> #include<unordered_map> #include <unordered_set> #include<array> #define gets(S) fgets(S,sizeof(S),stdin) #define ll long long const ll N = 1e6 + 5; const ll Max = 0x3f3f3f3f; using namespace std; ll n, m, saki[N]; ll fin(ll x) { return saki[x] == x ? x : saki[x] = fin(saki[x]); } void he(ll x, ll y) { saki[fin(x)] = fin(y); } int main() { cin >> n >> m; for (int i = 1; i <= n * 2; i++) { saki[i] = i; } char c; ll x, y; for (int i = 1; i <= m; i++) { cin >> c; cin >> x >> y; if (c == 'F') { he(x, y); } else { he(x + n, y); he(y + n, x); } } ll ans = 0; for (int i = 1; i <= n; i++) { if (fin(i) == i) { ans++; } } cout << ans; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:08:24

通信工程毕业论文(毕设)本科生方向汇总

【单片机毕业设计项目分享系列】 &#x1f525; 这里是DD学长&#xff0c;单片机毕业设计及享100例系列的第一篇&#xff0c;目的是分享高质量的毕设作品给大家。 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的单片机项目缺少创新和亮点…

作者头像 李华
网站建设 2026/6/10 15:30:42

C++中不能复制只能移动的类型

在 C 中&#xff0c;不能复制&#xff08;Non-Copyable&#xff09;但可以移动&#xff08;Movable&#xff09; 的类型通常是那些用于管理独占性资源的类。这些类的设计目标是确保在任何给定时间&#xff0c;只有一个对象拥有该资源的所有权&#xff0c;从而防止资源被重复释放…

作者头像 李华
网站建设 2026/6/10 6:28:32

企业质量管理数字化解决方案:构建全流程闭环管控体系

在市场竞争加剧与合规要求升级的背景下&#xff0c;质量管理已从传统的“事后检验”升级为贯穿企业价值链的“全流程管控”。企业亟需一套覆盖“策划-执行-监测-改进”的系统化方案&#xff0c;破解流程碎片化、数据孤岛、响应滞后等痛点&#xff0c;实现质量与效率的双重提升。…

作者头像 李华
网站建设 2026/6/10 14:11:46

9 个降AI率工具,研究生必备避坑指南

9 个降AI率工具&#xff0c;研究生必备避坑指南 AI降重工具&#xff1a;论文写作的“隐形助手” 在研究生阶段&#xff0c;论文写作不仅是学术能力的体现&#xff0c;更是一场与时间、技术、规范的较量。随着AI技术的广泛应用&#xff0c;许多学生发现自己的论文中出现了明显的…

作者头像 李华
网站建设 2026/6/9 14:17:31

基础搜索模块 Cordova 与 OpenHarmony 混合开发实战

&#x1f4cc; 概述 基础搜索模块提供了快速搜索喝茶记录的功能。该模块集成了 Cordova 框架与 OpenHarmony 原生能力&#xff0c;实现了高效的全文搜索和实时搜索结果展示。用户可以通过输入关键词快速查找相关的喝茶记录。模块支持按茶叶类型、产地和备注信息搜索&#xff0c…

作者头像 李华
网站建设 2026/6/9 21:36:06

深入解析Adobe AEM中的标签管理

在Adobe Experience Manager(AEM)中,标签(Tag)管理是内容管理的重要一环。通过合理地使用标签,可以显著提高内容的可发现性和管理效率。今天,我们将探讨如何在AEM的后台中获取和管理这些标签,结合具体的代码实例来展示这一过程。 什么是AEM中的标签? 在AEM中,标签是…

作者头像 李华