并查集——团伙(洛谷 P1892)
题目选自洛谷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)相关推荐
- 并查集——营救(洛谷 P1396)
题目选自洛谷P1396 看到最大的最小很多人想到二分,但是可以有更好的解法. 我们不妨用并查集维护这个图,将边从小到大排序,每次取出边权最小的边,若该边的起点与终点未在一个集合内,就将其合并.当源点与 ...
- 并查集——集合(洛谷 P1621)
题目选自洛谷P1621 一道并查集类型的算法题,基本框架不变,就是合并的时候怎么合并,合并哪些数? 筛出素数之后找出在 'p~b' 范围内的素数 然后枚举a~b之间的数,合并他们 最后看看那些数的祖先 ...
- 并查集——亲戚(洛谷 P1551)
题目选自洛谷P1551 并查集入门题目,简单有趣的例子了解并查集的使用 主要分为三个操作: 1)初始化 没有什么说的,就是用下标当做标号. 2)合并操作 如果两个关系的"老大"不一 ...
- 并查集——家谱(洛谷 P2814)
题目选自洛谷P2814 由于是字符串保存名字,使用数字对应数组来合并查找有一点麻烦,所以使用map将对应关系存起来即可. 因为map带有映射关系,好像不需要再写初始化和合并操作,用两个字符串变量,一个 ...
- 洛谷 P1892 [BOI2003]团伙(并查集变种 反集)
[BOI2003]团伙 题目描述 现在有 n n n 个人,他们之间有两种关系:朋友和敌人.我们知道: 一个人的朋友的朋友是朋友 一个人的敌人的敌人是朋友 现在要对这些人进行组团.两个人在一个团体内当 ...
- 洛谷P1892 [BOI2003]团伙
链接:P1892 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友. 两 ...
- BZOJ1370洛谷P1892 [BOI2003]团伙
并查集 我们将a的敌人定义为a+n,b的敌人的定义为b+n,所以a与b+n是一类人,b与a+n是一类人,然后就这么合并就好了 代码 //By AcerMo #include<cmath> ...
- 洛谷P1892.团伙
传送门 题目描述 给定 n个人,他们之间有两个种关系,朋友与敌对.可以肯定的是: 与我的朋友是朋友的人是我的朋友 与我敌对的人有敌对关系的人是我的朋友 现在这 n个人进行组团,两个人在一个团队内当且仅 ...
- 0x41.数据结构进阶 - 并查集
目录 一.路径压缩与按秩合并 1.AcWing 237. 程序自动分析(NOIP2015) 二.边带权并查集 1.AcWing 238. 银河英雄传说(边带权并查集模板) 2.AcWing 239. ...
最新文章
- div中的内容水平垂直居中
- linux权限776代表,Linux 权限设置chmod
- 发现一个木马,竟然偷传我珍藏几十G的视频!
- 机器人码垛手持式编程_三分钟告诉你企业为什么要使用全自动码垛机械手!
- 正则表达式的环视深度剖析
- 贪心算法—圣诞老人的礼物(POJ 4110)
- 重修 mongoDB 系列(一) 配置环境
- eclipse python_一文教你配置得心应手的Python
- 利用python处理dna序列_科学网-简单的Python脚本提取对应位置基因序列(fasta文件)-王彬忠的博文...
- 华为认证 HCNACloud 云计算题库
- 产品经理如何写出一看就想约的简历
- 算法帝国:华尔街交易怪兽的核武器缔造史
- java 栅栏_Java并发基础-栅栏(CountDownLatch)与闭锁(CyclicBarrier)
- 计算机科学是ei期刊吗,EI计算机期刊有哪些
- Rosalind Java| Counting DNA Nucleotides
- 笔试算法《简单密码》
- 北斗三号b1c频点带宽_北斗三号卫星导航信号及接收策略
- CnPlaza.com 照片打印管理 ​【使用说明-打印机设置】 即影即有
- Cocos2d 基础知识 2
- 【分享】无法访问GitHub 访问GitHub 解决访问GitHub
热门文章
- 不知道能不能赶上用这技术的那一天
- React组件的state和props
- devops定义_Coffee Shop DevOps:明确定义和传达团队目标
- raspberry pi_Raspberry Pi项目旨在调节室温并改善睡眠
- 前端:JS/25/DOM官方定义,DOM分类,HTML节点树(节点关系,节点类型,),核心DOM中公共的属性和方法(节点访问,查找DOM节点,节点属性,节点的创建,追加和删除)
- 类和模块 类和原型 工厂方法 构造函数 constructor
- Bootstrap3 模态对话框的方法
- es6 什么是async函数
- 万有引力的意思_万有引力和引力有什么不同?四种基本性质力中电磁力最多
- linux能运行英魂之刃吗,英魂之刃需要什么电脑配置