当前位置: 首页 > news >正文

洛谷 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; }
http://www.zskr.cn/news/112955.html

相关文章:

  • 商业模式画布填充:LobeChat理清商业逻辑
  • 计算机Java毕设实战-基于Java的仓库管理系统设计与实现基于Java+SpringBoot+Vue仓库管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于JavaWeb的心聘求职平台的设计与实现基于springboot的人才求职招聘平台设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于JavaWeb的家装一体化平台室内设计、装修施工、建材选购【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于javaweb的宠物托管系统基于springboot+vue的宠物托管系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 巴菲特的投资观察与启示
  • 芒格的“反向工程“思维在量子密码破解防御中的应用
  • 9 个高效降AI率工具,自考人必备!
  • 10个降AI率工具,专科生高效避坑指南
  • AI绘画商业化落地:图像生成应用的7个盈利模式
  • LobeChat新品发布新闻稿撰写
  • LobeChat版本更新日志解读:v0.8.5新增特性一览
  • LobeChat能否挑战商业AI产品?我们做了全面评估
  • LobeChat CI/CD自动化部署流水线搭建实例
  • LobeChat产品研发优先级建议
  • LobeChat能否实现批量生成文案?营销场景高效应用
  • LobeChat估值预测:下一个独角兽AI基础设施?
  • 8 个 AI 写作工具,MBA 论文轻松搞定!
  • Ansible之Playbook简单应用
  • LobeChat关键信息提取在合同审查中应用
  • 15瓦到1000瓦完整量产版开关电源方案,有图纸,bom,变压器和各种磁芯图纸,可以直接生产
  • LobeChat董事会汇报PPT内容生成
  • 【全面实战】从DVWA搭建到全漏洞复现(1)
  • 爆肝整理,13年测试老鸟性能测试-性能指标汇总,一篇打通...
  • 2025年Go加密安全爆料:你的系统真的安全吗?量子威胁早就来了!
  • 大头针AI爆火背后:音乐创作平民化与华语乐坛的算法革命
  • 关于xml动态sql的思路
  • 一文学会设计模式之行为型模式及最佳实现
  • 脚本网页 地球演化
  • 介观交通流仿真软件:Aimsun Next_(9).仿真结果分析与可视化