题目选自洛谷P1892

最基础的并查集是给出关系直接合并,这道题呢稍微多了一些条件,就是敌人的敌人也是自己的朋友,所以在合并的时候多了几步操作。

首先,要充分理解题目。 “敌人的敌人就是朋友”可以这么理解:如果一个人有两个或更多敌人,这些敌人就应该被合并。

代码中的enm数组就是记录了每个人的第一个敌人,再遇到敌人时就把这两个敌人合并。

没想出这点的话还是挺难做的。

因此我们可以这样操作:

Friend合并,Enemy记录,再把下一个Enemy和记录的Enemy合并。因为敌人的敌人是朋友。比如E 1 2, E 2 3 记录E[1] = 2, E[2] = 1,现在到了E 2 3, E[2]有了,那么把1,3合并,然后记录E[3] = 2。由于敌人的敌人已经合并,那么这时的1或者3都是2的敌人,取一个代表就行,下次再碰到2和某个人是敌人,把他和1合并或把它和3合并是一样的。连通块在合并的时候统计就可以了。

于是就有了下面这部分的代码:

if(e[p]==0) e[p]=find(q);else merge(q,e[p]);if(e[q]==0) e[q]=find(p);else merge(p,e[q]);

题目描述

给定 n 个人,他们之间有两个种关系,朋友与敌对。可以肯定的是:

  • 与我的朋友是朋友的人是我的朋友
  • 与我敌对的人有敌对关系的人是我的朋友

现在这 n 个人进行组团,两个人在一个团队内当且仅当他们是朋友。

求最多的团体数。

输入格式

第一行一个整数 n 代表人数。
第二行一个整数 m 代表每个人之间的关系。
接下来 m 行每行一个字符 opt 与两个整数 p,q

  • 如果 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\%100% 的数据,2≤n≤1000,1≤m≤5000,1≤p,q≤n。

解题代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int f[1001],e[1001],n,m,p,q,ans;
char opt;
void init(){for(int i=1;i<=n;i++) f[i] = i;
}
int find(int x){if(f[x] == x) return x;return f[x]=find(f[x]);
}
void merge(int a,int b){if(find(a) != find(b))f[find(a)] = find(b);
}
int main(){cin>>n>>m;init();for(int i=1;i<=m;i++){cin>>opt>>p>>q;if(opt == 'F') merge(p,q);else{if(e[p]==0) e[p]=find(q);else merge(q,e[p]);if(e[q]==0) e[q]=find(p);else merge(p,e[q]);}}for(int i=1;i<=n;i++)if(f[i]==i) ans++;printf("%d",ans);return 0;
}

并查集——团伙(洛谷 P1892)相关推荐

  1. 并查集——营救(洛谷 P1396)

    题目选自洛谷P1396 看到最大的最小很多人想到二分,但是可以有更好的解法. 我们不妨用并查集维护这个图,将边从小到大排序,每次取出边权最小的边,若该边的起点与终点未在一个集合内,就将其合并.当源点与 ...

  2. 并查集——集合(洛谷 P1621)

    题目选自洛谷P1621 一道并查集类型的算法题,基本框架不变,就是合并的时候怎么合并,合并哪些数? 筛出素数之后找出在 'p~b' 范围内的素数 然后枚举a~b之间的数,合并他们 最后看看那些数的祖先 ...

  3. 并查集——亲戚(洛谷 P1551)

    题目选自洛谷P1551 并查集入门题目,简单有趣的例子了解并查集的使用 主要分为三个操作: 1)初始化 没有什么说的,就是用下标当做标号. 2)合并操作 如果两个关系的"老大"不一 ...

  4. 并查集——家谱(洛谷 P2814)

    题目选自洛谷P2814 由于是字符串保存名字,使用数字对应数组来合并查找有一点麻烦,所以使用map将对应关系存起来即可. 因为map带有映射关系,好像不需要再写初始化和合并操作,用两个字符串变量,一个 ...

  5. 洛谷 P1892 [BOI2003]团伙(并查集变种 反集)

    [BOI2003]团伙 题目描述 现在有 n n n 个人,他们之间有两种关系:朋友和敌人.我们知道: 一个人的朋友的朋友是朋友 一个人的敌人的敌人是朋友 现在要对这些人进行组团.两个人在一个团体内当 ...

  6. 洛谷P1892 [BOI2003]团伙

    链接:P1892 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友. 两 ...

  7. BZOJ1370洛谷P1892 [BOI2003]团伙

    并查集 我们将a的敌人定义为a+n,b的敌人的定义为b+n,所以a与b+n是一类人,b与a+n是一类人,然后就这么合并就好了 代码 //By AcerMo #include<cmath> ...

  8. 洛谷P1892.团伙

    传送门 题目描述 给定 n个人,他们之间有两个种关系,朋友与敌对.可以肯定的是: 与我的朋友是朋友的人是我的朋友 与我敌对的人有敌对关系的人是我的朋友 现在这 n个人进行组团,两个人在一个团队内当且仅 ...

  9. 0x41.数据结构进阶 - 并查集

    目录 一.路径压缩与按秩合并 1.AcWing 237. 程序自动分析(NOIP2015) 二.边带权并查集 1.AcWing 238. 银河英雄传说(边带权并查集模板) 2.AcWing 239. ...

最新文章

  1. div中的内容水平垂直居中
  2. linux权限776代表,Linux 权限设置chmod
  3. 发现一个木马,竟然偷传我珍藏几十G的视频!
  4. 机器人码垛手持式编程_三分钟告诉你企业为什么要使用全自动码垛机械手!
  5. 正则表达式的环视深度剖析
  6. 贪心算法—圣诞老人的礼物(POJ 4110)
  7. 重修 mongoDB 系列(一) 配置环境
  8. eclipse python_一文教你配置得心应手的Python
  9. 利用python处理dna序列_科学网-简单的Python脚本提取对应位置基因序列(fasta文件)-王彬忠的博文...
  10. 华为认证 HCNA­Cloud 云计算题库
  11. 产品经理如何写出一看就想约的简历
  12. 算法帝国:华尔街交易怪兽的核武器缔造史
  13. java 栅栏_Java并发基础-栅栏(CountDownLatch)与闭锁(CyclicBarrier)
  14. 计算机科学是ei期刊吗,EI计算机期刊有哪些
  15. Rosalind Java| Counting DNA Nucleotides
  16. 笔试算法《简单密码》
  17. 北斗三号b1c频点带宽_北斗三号卫星导航信号及接收策略
  18. CnPlaza.com 照片打印管理 ​【使用说明-打印机设置】 即影即有
  19. Cocos2d 基础知识 2
  20. 【分享】无法访问GitHub 访问GitHub 解决访问GitHub

热门文章

  1. 不知道能不能赶上用这技术的那一天
  2. React组件的state和props
  3. devops定义_Coffee Shop DevOps:明确定义和传达团队目标
  4. raspberry pi_Raspberry Pi项目旨在调节室温并改善睡眠
  5. 前端:JS/25/DOM官方定义,DOM分类,HTML节点树(节点关系,节点类型,),核心DOM中公共的属性和方法(节点访问,查找DOM节点,节点属性,节点的创建,追加和删除)
  6. 类和模块 类和原型 工厂方法 构造函数 constructor
  7. Bootstrap3 模态对话框的方法
  8. es6 什么是async函数
  9. 万有引力的意思_万有引力和引力有什么不同?四种基本性质力中电磁力最多
  10. linux能运行英魂之刃吗,英魂之刃需要什么电脑配置