luogu P1892 团伙
P1892 团伙
题目描述
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 思路
题目的数据比较水。。。。
要注意的有比如,可能不是朋友也不是敌人啊QwQ
然后的话,朋友肯定是一个集合的啦,那么敌人的话呢?
因为深受上次在JZ时小X的最短路的洗脑,于是有了对Floyd的各种奇奇怪怪的用法,
就是说我们每次读入一对敌人a和b,
那么以a作为中间点,那么他的所有敌人肯定就是一个朋友集合啊,那就把b加到这个朋友集合里面;
然后以b作为中间点,同上原理。【刚开始这里手残打错了。。。】
统计的时候只要统计father[k]=k的个数就可以了
Codes
1 program group; 2 const 3 inf='group.in'; 4 outf='group.out'; 5 var 6 father:array[0..1000] of longint; 7 aa:array[1..1000] of longint; //aa[i]表示i的敌人集合 ,就是i所在的集合的补集 8 ch:array[1..1000] of boolean; 9 i,n,m,a,b,t1,t2,total,k,t,j:longint; 10 p:char; 11 12 function find(apple:longint):longint; 13 begin 14 if father[apple]<>apple then father[apple]:=find(father[apple]); 15 exit(father[apple]); 16 end; 17 18 procedure union(a,b:longint); 19 begin 20 t1:=find(a); 21 t2:=find(b); 22 if t1<>t2 then father[t2]:=t1; 23 end; 24 25 begin 26 //assign(input,inf); 27 //assign(output,outf); 28 //reset(input); rewrite(output); 29 30 readln(n); readln(m); 31 for i:= 1 to n do 32 father[i]:=i; 33 34 for i:= 1 to m do 35 begin 36 readln(p,a,b); 37 if p='E' then begin 38 if aa[a]=0 then aa[a]:=b 39 else union(b,aa[a]); 40 if aa[b]=0 then aa[b]:=a 41 else union(a,aa[b]); 42 end 43 else union(a,b); 44 end; 45 46 for k:= 1 to n do 47 if k=father[k] then inc(total); 48 49 writeln(total); 50 51 close(input); 52 close(output); 53 end.
下面是刚开始的版本,略逊与上面,因为每次都和敌人集合每一个合并了,白白浪费了时间【逃】
1 program group; 2 const 3 inf='group.in'; 4 outf='group.out'; 5 var 6 father:array[0..1000] of longint; 7 aa:array[1..1000,0..1000] of longint; 8 ch:array[1..1000] of boolean; 9 i,n,m,a,b,t1,t2,total,k,t,j,y:longint; 10 st:string; 11 p:char; 12 13 function find(apple:longint):longint; 14 begin 15 if father[apple]<>apple then father[apple]:=find(father[apple]); 16 exit(father[apple]); 17 end; 18 19 procedure union(a,b:longint); 20 begin 21 t1:=find(a); 22 t2:=find(b); 23 if t1<>t2 then father[t2]:=t1; 24 end; 25 26 begin 27 // assign(input,inf); 28 // assign(output,outf); 29 // reset(input); rewrite(output); 30 31 readln(n); readln(m); 32 for i:= 1 to n do 33 father[i]:=i; 34 35 for i:= 1 to m do 36 begin 37 readln(st); 38 p:=st[1]; 39 st:=copy(st,3,n-2); 40 y:=pos(' ',st); 41 val(copy(st,1,y-1),a); 42 val(copy(st,y+1,n-y),b); 43 44 if p='E' then begin 45 for j:= 1 to aa[a,0] do 46 union(b,aa[a,j]); 47 for j:= 1 to aa[b,0] do 48 union(a,aa[b,j]); 49 inc(aa[a,0]); aa[a,aa[a,0]]:=b; 50 inc(aa[b,0]); aa[b,aa[b,0]]:=a; 51 continue; 52 end 53 else union(a,b); 54 end; 55 56 for k:= 1 to n do 57 if k=father[k] then inc(total); 58 59 writeln(total); 60 61 close(input); 62 close(output); 63 end.
转载于:https://www.cnblogs.com/bobble/p/6379632.html
luogu P1892 团伙相关推荐
- [luogu p1892] [BOI2003]团伙
传送门 [BOI2003]团伙 题目描述 给定 \(n\) 个人,他们之间有两个种关系,朋友与敌对.可以肯定的是: 与我的朋友是朋友的人是我的朋友 与我敌对的人有敌对关系的人是我的朋友 现在这 \(n ...
- 洛谷P1892.团伙
传送门 题目描述 给定 n个人,他们之间有两个种关系,朋友与敌对.可以肯定的是: 与我的朋友是朋友的人是我的朋友 与我敌对的人有敌对关系的人是我的朋友 现在这 n个人进行组团,两个人在一个团队内当且仅 ...
- Luogu P1525 【关押罪犯】
跟P1892团伙的做法类似. 除了用数组保存敌人编号之外,还有另一种做法. 团伙:合并时,用i节点表示为友,i+n结点表示为敌. 本题:合并时,用i节点表示同一监狱,i+n结点表示不同监狱. 按边权从 ...
- P1892 [BOI2003]团伙(反集)
P1892 [BOI2003]团伙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 现在有 nn 个人,他们之间有两种关系:朋友和敌人.我们知道: 一个人的朋友的朋友是朋友 ...
- 【并查集】团伙(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.初始化 ...
- 洛谷P1892 [BOI2003]团伙
链接:P1892 题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友. 两 ...
- 并查集——团伙(洛谷 P1892)
题目选自洛谷P1892 最基础的并查集是给出关系直接合并,这道题呢稍微多了一些条件,就是敌人的敌人也是自己的朋友,所以在合并的时候多了几步操作. 首先,要充分理解题目. "敌人的敌人就是朋友 ...
- 洛谷 P1892 [BOI2003]团伙(并查集变种 反集)
[BOI2003]团伙 题目描述 现在有 n n n 个人,他们之间有两种关系:朋友和敌人.我们知道: 一个人的朋友的朋友是朋友 一个人的敌人的敌人是朋友 现在要对这些人进行组团.两个人在一个团体内当 ...
最新文章
- Can’t connect to local MySQL server through socket的解决方法
- oracle服务器找不到怎么解决,简析Oracle数据库常见问题及解决方案
- 十一、飞机大战(IVX 快速开发教程)
- #时间预测算法_【时间序列】时序预测竞赛之异常检测算法综述
- Java遍历Map的4种方式
- miui通知栏要点两下_「MIUI玩机技巧56」小米应用商店 新增 通知栏快捷入口
- +搭建“记忆宫殿”的三款思维导图神器
- 页面body元素#65279导致顶部空白一行解决方法
- 树状数组 (数据结构)
- node实现敏感词过滤及敏感词库
- 初使用tbs的x5内核所遇到的坑,初学者如何第一次跑起x5内核
- 虚幻引擎编程基础(二)
- 聚观早报 | 华为官宣新机Pocket S;苹果旗舰店开售智能门锁
- 小米线刷工具 MiFlash 提示长度不能小于 0 参数名 length,无法读取设备解决方法
- IIS无法启动计算机上的服务W3SVC如何修复
- 使用python打开多台IMAGINGSOURCE工业相机
- 牛客 NC24858 [USACO 2009 Nov S]Job Hunt
- sdcc对应stc51单片机
- The producer group has been created before
- 【读书笔记】AUTOSAR规范与车用控制器软件开发02
热门文章
- h264解码延迟优化_JEET Air Plus:延迟优化技术,让你游戏不掉线
- java implements this,Java – 何时使用“this”关键字
- linux端口连通性测试telnet、wget、ssh、curl
- java判断小数点后是否为0,是的话则取整,不是的话则保留
- layUI日期框回调函数
- 纯html网页,如何快速把所有字体的颜色都改成黑色的,原来模板默认的字体是灰色
- 这是一份简易的ACM模板
- 【CCCC】L3-013 非常弹的球 (30分)物理计算
- 【NOI OpenJudge1789】算24(搜索)
- 【Ahoi2005】【BZOJ1968】COMMON 约数研究(水题,乱搞,约数)