2597 团伙(并查集就是好用!)
2597 团伙
1920年的芝加哥,出现了一群强盗。如果两个强盗遇上了,那么他们要么是朋友,要么是敌人。而且有一点是肯定的,就是:
我朋友的朋友是我的朋友;
我敌人的敌人也是我的朋友。
两个强盗是同一团伙的条件是当且仅当他们是朋友。现在给你一些关于强盗们的信息,问你最多有多少个强盗团伙。
输入文件gangs.in的第一行是一个整数N(2<=N<=1000),表示强盗的个数(从1编号到N)。 第二行M(1<=M<=5000),表示关于强盗的信息条数。 以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敌人。输入数据保证不会产生信息的矛盾。
输出文件gangs.out只有一行,表示最大可能的团伙数。
6
4
E 1 4
F 3 5
F 4 6
E 1 2
3
2<=N<=1000
1<=M<=5000
1<=p q<=N
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define N 1010 6 int far[N]; 7 int n,m; 8 int a,b; 9 char q; 10 int enemy[N][N]; //记录下敌人 11 int vis[N]; 12 int ans; 13 int Find_(int a) //查找最顶端的元素 14 { 15 if(far[a]!=a)far[a]=Find_(far[a]); 16 return far[a]; 17 } 18 void In_() //输入 19 { 20 scanf("%d%d",&n,&m); 21 for(int i=1;i<=n;++i) //初始化 22 far[i]=i; 23 for(int i=1;i<=m;++i) 24 { 25 cin>>q; 26 scanf("%d%d",&a,&b); 27 if(q=='F') 28 { 29 int r=Find_(a); 30 int rr=Find_(b); 31 if(r!=rr)far[rr]=r; //进行合并 32 } 33 else { 34 enemy[a][++enemy[a][0]]=b; //记下敌人 35 enemy[b][++enemy[b][0]]=a; 36 } 37 } 38 } 39 void Work_() 40 { 41 for(int j=1;j<=n;++j) //遍历所有人的敌人 将敌人人的敌人变成朋友 42 { 43 for(int i=1;i<enemy[j][0];++i) 44 { 45 int r=Find_(enemy[j][i]); 46 int rr=Find_(enemy[j][i+1]); 47 if(r!=rr)far[rr]=r; 48 else continue; 49 } 50 } 51 memset(vis,0,sizeof(vis)); 52 for(int i=1;i<=n;++i) 53 { 54 vis[Find_(i)]=1; 55 } 56 for(int i=1;i<=n;++i) 57 { 58 if(vis[i])ans++; //记下多少个团伙 59 } 60 } 61 void Out_() //输出 62 { 63 cout<<ans; 64 } 65 int main() 66 { 67 In_(); 68 Work_(); 69 Out_(); 70 return 0; 71 }
转载于:https://www.cnblogs.com/mjtcn/p/6701116.html
2597 团伙(并查集就是好用!)相关推荐
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...
- 【bzoj1370】[Baltic2003]Gang团伙 并查集
题目描述 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: 所有是朋友的人组成一个团伙.告诉你关于这n个人的m条信息, ...
- [codevs2597]团伙并查集
题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...
- 团伙 并查集_BZOJ 1370 Baltic2003 Gang团伙 并查集
题目大意:给定n个人,朋友的朋友是朋友,敌人的敌人是朋友,朋友之间组成一个团伙,求团伙数 将每个点x拆成两个:x和x+n 如果x和y是朋友,就将x和y合并 如果x和y是敌人,就将x和y+n合并,将y和 ...
- 【洛谷1892】团伙 并查集
题意 题面说的很清楚 同noip2010关押罪犯 传送门:http://blog.csdn.net/dadatu_zhao/article/details/78806584 #include<i ...
- 漫画:什么是 “并查集” ?
作者 | 封承成 来源 | 程序员小灰(ID:chengxuyuanxiaohui) 导语:并查集是一种精巧的算法,本身并不难理解,却很常用,在许多场景下都能找到并查集的身影. 本文作者封承成,年仅1 ...
- 什么是 “并查集” ?
导语:并查集是一种精巧的算法,本身并不难理解,却很常用,在许多场景下都能找到并查集的身影. 本文作者封承成,年仅12岁,非常感谢他的投稿. 并查集是什么 并查集,是一种判断"远房亲戚&quo ...
- 【并查集】团伙(luogu 1892)
团伙 luogu 1892 代码: 定义对手的对手是朋友,朋友的朋友是朋友,现在有n个人和m组关系,如果两个人是朋友那么他们属于同一个团伙,问有多少个团伙 原题: 题目描述 1920年的芝加哥,出现了 ...
- 精讲并查集经典习题:P1892 [BOI2003]团伙(超详细)
一,需要开o2才能AC的代码 用emys[i]存储第i个人的敌人数,vector<long long>emyr[i]存储i个人的所以敌人,fa[i]存储第i个人的大boss. 1.初始化 ...
最新文章
- 到底选择PostgreSOL还是MySQL?看这里!
- 解决fitz模块报错
- AtCoder AGC038D Unique Path (图论)
- DataSet 的 Merge 方法
- matplotlib实践过程总结
- Docker入门-安装
- 试翻译Output Cache Improvements in Orchard 1.9
- http://selectorgadget.com/
- DNN Mail功能介绍 [DNN 3.2.2]
- java学习之类型转换与越界
- 家庭网络,怎么给每个房间装一个无线路由器?
- 冒泡排序C语言代码 时间复杂度
- 中职计算机课应用的内容,信息技术手段在中职学校计算机课程教学中的应用
- java键盘钩子_jna test【鼠标 键盘钩子】
- C#实现封装SPC过程能力工具类ProcessCababilityHelper
- PPT的一键操作 原来这么神奇
- python搭建轻服务,实现上传下载文件
- JavaScript 内置对象
- 在线正则表达式测试工具
- oculus 登录 错误代码 ovr40779122
热门文章
- linux7系统怎么启动ftp,CentOS 7上启动 vsftp报错解决一例
- c c python的区别_python和c语言的主要区别总结
- Android加上base的作用,android-notifyDataSetChanged在BaseAdapter上不起作用
- 搜索引擎下拉食云速捷详细_详细解析关键词与搜索引擎之间的霸屏关系
- Linux学习笔记---使用MfgTool工具烧写官方系统(一)
- window10本地解析域名
- 【深度学习理论】一文搞透pytorch中的tensor、autograd、反向传播和计算图
- 排序算法lowb三人组-插入排序
- Spring Cloud 架构 五大神兽的功能
- Huge page使用的一些问题