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只有一行,表示最大可能的团伙数。

输入输出样例

输入样例#1:

6
4
E 1 4
F 3 5
F 4 6
E 1 2

输出样例#1:

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 团伙相关推荐

  1. [luogu p1892] [BOI2003]团伙

    传送门 [BOI2003]团伙 题目描述 给定 \(n\) 个人,他们之间有两个种关系,朋友与敌对.可以肯定的是: 与我的朋友是朋友的人是我的朋友 与我敌对的人有敌对关系的人是我的朋友 现在这 \(n ...

  2. 洛谷P1892.团伙

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

  3. Luogu P1525 【关押罪犯】

    跟P1892团伙的做法类似. 除了用数组保存敌人编号之外,还有另一种做法. 团伙:合并时,用i节点表示为友,i+n结点表示为敌. 本题:合并时,用i节点表示同一监狱,i+n结点表示不同监狱. 按边权从 ...

  4. P1892 [BOI2003]团伙(反集)

    P1892 [BOI2003]团伙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 现在有 nn 个人,他们之间有两种关系:朋友和敌人.我们知道: 一个人的朋友的朋友是朋友 ...

  5. 【并查集】团伙(luogu 1892)

    团伙 luogu 1892 代码: 定义对手的对手是朋友,朋友的朋友是朋友,现在有n个人和m组关系,如果两个人是朋友那么他们属于同一个团伙,问有多少个团伙 原题: 题目描述 1920年的芝加哥,出现了 ...

  6. 精讲并查集经典习题:P1892 [BOI2003]团伙(超详细)

    一,需要开o2才能AC的代码 用emys[i]存储第i个人的敌人数,vector<long long>emyr[i]存储i个人的所以敌人,fa[i]存储第i个人的大boss. 1.初始化  ...

  7. 洛谷P1892 [BOI2003]团伙

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

  8. 并查集——团伙(洛谷 P1892)

    题目选自洛谷P1892 最基础的并查集是给出关系直接合并,这道题呢稍微多了一些条件,就是敌人的敌人也是自己的朋友,所以在合并的时候多了几步操作. 首先,要充分理解题目. "敌人的敌人就是朋友 ...

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

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

最新文章

  1. Can’t connect to local MySQL server through socket的解决方法
  2. oracle服务器找不到怎么解决,简析Oracle数据库常见问题及解决方案
  3. 十一、飞机大战(IVX 快速开发教程)
  4. #时间预测算法_【时间序列】时序预测竞赛之异常检测算法综述
  5. Java遍历Map的4种方式
  6. miui通知栏要点两下_「MIUI玩机技巧56」小米应用商店 新增 通知栏快捷入口
  7. +搭建“记忆宫殿”的三款思维导图神器
  8. 页面body元素#65279导致顶部空白一行解决方法
  9. 树状数组 (数据结构)
  10. node实现敏感词过滤及敏感词库
  11. 初使用tbs的x5内核所遇到的坑,初学者如何第一次跑起x5内核
  12. 虚幻引擎编程基础(二)
  13. 聚观早报 | 华为官宣新机Pocket S;苹果旗舰店开售智能门锁
  14. 小米线刷工具 MiFlash 提示长度不能小于 0 参数名 length,无法读取设备解决方法
  15. IIS无法启动计算机上的服务W3SVC如何修复
  16. 使用python打开多台IMAGINGSOURCE工业相机
  17. 牛客 NC24858 [USACO 2009 Nov S]Job Hunt
  18. sdcc对应stc51单片机
  19. The producer group has been created before
  20. 【读书笔记】AUTOSAR规范与车用控制器软件开发02

热门文章

  1. h264解码延迟优化_JEET Air Plus:延迟优化技术,让你游戏不掉线
  2. java implements this,Java – 何时使用“this”关键字
  3. linux端口连通性测试telnet、wget、ssh、curl
  4. java判断小数点后是否为0,是的话则取整,不是的话则保留
  5. layUI日期框回调函数
  6. 纯html网页,如何快速把所有字体的颜色都改成黑色的,原来模板默认的字体是灰色
  7. 这是一份简易的ACM模板
  8. 【CCCC】L3-013 非常弹的球 (30分)物理计算
  9. 【NOI OpenJudge1789】算24(搜索)
  10. 【Ahoi2005】【BZOJ1968】COMMON 约数研究(水题,乱搞,约数)