POJ2912 Rochambeau [扩展域并查集]

  题目传送门

Rochambeau

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 4463   Accepted: 1545

Description

N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is the judge. The rest children are divided into three groups (it is possible that some group is empty). You don’t know who is the judge, or how the children are grouped. Then the children start playing Rochambeau game for M rounds. Each round two children are arbitrarily selected to play Rochambeau for one once, and you will be told the outcome while not knowing which gesture the children presented. It is known that the children in the same group would present the same gesture (hence, two children in the same group always get draw when playing) and different groups for different gestures. The judge would present gesture randomly each time, hence no one knows what gesture the judge would present. Can you guess who is the judge after after the game ends? If you can, after how many rounds can you find out the judge at the earliest?

Input

Input contains multiple test cases. Each test case starts with two integers N and M (1 ≤ N ≤ 500, 0 ≤ M ≤ 2,000) in one line, which are the number of children and the number of rounds. Following are M lines, each line contains two integers in [0, N) separated by one symbol. The two integers are the IDs of the two children selected to play Rochambeau for this round. The symbol may be “=”, “>” or “<”, referring to a draw, that first child wins and that second child wins respectively.

Output

There is only one line for each test case. If the judge can be found, print the ID of the judge, and the least number of rounds after which the judge can be uniquely determined. If the judge can not be found, or the outcomes of the M rounds of game are inconsistent, print the corresponding message.

Sample Input

3 3
0<1
1<2
2<0
3 5
0<1
0>1
1<2
1>2
0<2
4 4
0<1
0>1
2<3
2>3
1 0

Sample Output

Can not determine

Player 1 can be determined to be the judge after 4 lines

Impossible

Player 0 can be determined to be the judge after 0 lines



  分析:比较复杂的一道扩展域并查集,不仅操作麻烦而且输入输出的要求还贼多。。。做的时候还遇到了一堆玄学错误。。。

  首先枚举每一个人,表示这个人是裁判,然后将没有这个人参与的比赛情况放入并查集中,如果没有矛盾则说名这个人可以是裁判,否则这个人就不能是裁判。如果发现没有满足要求的人,则输出Impossible,如果裁判不止一个则输出Can not determine,否则就可以输出这个人。在操作的时候可以放一个擂台记录一下line数。当然其中有很多小细节不好一一列举,具体看代码吧。

  Code:

 1 //It is made by HolseLee on 29th May 2018
 2 //POJ 2912
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<iostream>
 8 #include<iomanip>
 9 #include<algorithm>
10 #define Fi(i,a,b) for(int i=a;i<=b;i++)
11 #define Fx(i,a,b) for(int i=a;i>=b;i--)
12 using namespace std;
13 const int N=507;const int M=2007;
14 int n,m,rank[N],fa[N];
15 inline int find(int a)
16 {
17     if(fa[a]!=a){
18         int father=find(fa[a]);
19         rank[a]=(rank[a]+rank[fa[a]])%3;
20         fa[a]=father;}
21     return fa[a];
22 }
23 inline bool check(int a,int b,int c)
24 {
25     int fx=find(a);int fy=find(b);
26     if(fx==fy){if((rank[b]-rank[a]+3)%3!=c)return true;}
27     else{fa[fy]=fx;rank[fy]=(rank[a]-rank[b]+c+3)%3;}return false;
28 }
29 int main()
30 {
31     for(;scanf("%d%d",&n,&m)!=EOF;){
32         int x[M],y[M],ch[M];
33         int tot=0,cnt=0,ans=0,c;bool flag;
34         Fi(i,1,m){scanf("%d%c%d",&x[i],&ch[i],&y[i]);}
35         Fi(i,0,n-1){flag=true;Fi(j,0,n-1)fa[j]=j,rank[j]=0;
36         Fi(j,1,m){if(x[j]==i||y[j]==i)continue;
37         if(ch[j]==‘=‘)c=0;else if(ch[j]==‘>‘)c=1;else c=2;
38         if(check(x[j],y[j],c)){cnt=max(cnt,j);flag=false;break;}}
39         if(flag){tot++;ans=i;}}
40         if(!tot)printf("Impossible\n");
41         else if(tot>1)printf("Can not determine\n");
42         else printf("Player %d can be determined to be the judge after %d lines\n",ans,cnt);
43     }return 0;
44 }

原文地址:https://www.cnblogs.com/cytus/p/9108084.html

时间: 2024-10-09 21:21:37

POJ2912 Rochambeau [扩展域并查集]的相关文章

AcWing:240. 食物链(扩展域并查集)

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形. A吃B, B吃C,C吃A. 现有N个动物,以1-N编号. 每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是”1 X Y”,表示X和Y是同类. 第二种说法是”2 X Y”,表示X吃Y. 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的. 当一句话满足下列三条之一时,这句话就是假话,否则就是真话. 1) 当前

poj2912 带权并查集

题意:多个人玩石头剪刀布,每个人提前选定了自己出哪个手势,而其中有一种特殊的人他可以随意出什么手势,问是否能够从给出的一系列石头剪刀布游戏中判断出哪个是特殊的,可以从第几局游戏中判断出来. 首先按照食物链那题的做法,定 0,1,2 做为三种手势就可以了,但是这题非常坑,如果在前面的游戏中就能够判断特殊的人了,那么之后的游戏就算有其他矛盾发生也不管了,所以只能找到错就跳出……不过由于判断是哪个人比较麻烦,不知道哪个人的选择是无效的,就不知道那几次游戏是不正确不能加入并查集的,因此就直接暴力枚举每个

【POJ2912】【并查集】Rochambeau

Description N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is the judge. The rest children are divided into three groups (it is possible that some group is empty). You don’t know who is the judge, or how the childr

Noi2001 食物链(扩展域并查集)

4832: Noi2001 食物链 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 13  Solved: 12[Submit][Status][Web Board] Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1

poj1733 Parity Game(扩展域并查集)

描述 Now and then you play the following game with your friend. Your friend writes down a sequence consisting of zeroes and ones. You choose a continuous subsequence (for example the subsequence from the third to the fifth digit inclusively) and ask hi

【原创】并查集之扩展域与边带权

[前言] 并查集是一种可以动态维护若干个不重叠的集合,并支持合并于查询的数据结构. 并查集的基本概念很简单,但是这样一种思想的用途十分广泛. 个人理解:这是一种很巧妙的,可以很好的处理对象之间关系的数据结构. 那么先在这里提一下并查集的适用问题(划重点): 在一张无向图中维护节点之间的连通性或子图之间的连通性(图论优化) 动态维护许多具有传递性的关系(基本特性) 利用路径压缩来统计每个节点到树根之间路径上的一些信息(边带权) 维护具有多重关系的集合(扩展域) 以上基本上就是最高涉及到NOI级别难

「带权并查集」奇偶游戏

奇偶游戏 原题链接:奇偶游戏 题目大意 给你N个区间,每个区间给你它含1的奇偶性,问你哪些询问逻辑上冲突 题目题解 一道带权并查集的题,让我对带权并查集有了更深入的理解,带权并查集可以分为两种(在这道题中) "边带权"并查集 "扩展域"并查集 两种方法都是思维上的不同所造成的,其中第一种解法是最常见的,第二种解法在代码实现上是最简单的,我们先来对第一种进行探究 边带权,很明显,我们要在并查集的边上进行一个储存边权的操作,我们这里用d来表示当前节点到根节点的Xor值,

poj 2912 Rochambeau(带权并查集 + 暴力)

题目:poj 2912 Rochambeau(带权并查集 + 暴力) 题目大意:题目给出三个团队和一个裁判,这三个团队和裁判一起玩剪刀石头布,然后规定每个团队必须出一样的,只有裁判可以任意出.然后给出关系,x > y 代表 x 赢y , x < y代表 y 赢 x , 相等则出的一样.问这样的关系可以推出裁判是哪个吗?可以需要说明从第一条到第几条推出来的,不可以也要说明是不可能出现这样的关系,还是裁判不唯一. 解题思路:这题重点是裁判在里面会扰乱关系,并且n * m 才 100000,完全可以

poj 2912 Rochambeau(枚举+带权并查集)

题目链接:http://poj.org/problem?id=2912 题意:多个人玩石头剪刀布分成3组和一个裁判,每一组提前选定了自己出哪个手势,裁判可以随意出什么手势,问是否能够从给出的一系列石头剪刀布游戏中判断出哪个是裁判的,可以从第几局游戏中判断出来. 由于这题的数据量比较小可以枚举一下,枚举一下每一个人假设他们是裁判然后一系列并查集下来看 有没有出现矛盾如果没有那么这个人可能是裁判候补,如果有矛盾那么这个人肯定不是记录一下出现 问题的位置然后继续枚举.位置要去最远的,因为都要判完才知道