Rochambeau

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 5208   Accepted: 1778

题目链接http://poj.org/problem?id=2912

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

题意:

n个小朋友被分为三组玩剪刀石头布,每一组的小朋友只出固定的招数,但是这些小朋友里面有个裁判,他可以任意出,现在问是否能够确定出这个裁判,最少经过几轮?

题解:

三个组并且是个关于输赢的环状关系,所以我们可以思考带权并查集,v[x]代表x与其父亲结点的关系,v[x]=0代表同类,v[x]=1代表x赢他父亲,v[x]=2就代表输了。

现在关键是这个裁判,我们通过思考可以发现,假如确定了这个人为裁判,那么他参与的几次都不算做分组。

但如何去确定就是个问题。注意这题时间限制挺大的,所以我们直接枚举,假定每个人都作为裁判就行了。

最后还要确定经过几轮游戏,这里挺有意思的:

确定目前这个人为裁判,这等价于排除其他所有人不是裁判的最少次数,这个在枚举其他人作为裁判时就可以进行处理了。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; const int N = ;
int n,m;
int f[N],a[N],b[N],v[N],ans[N];
char c[N]; int find(int x){
if(x==f[x]) return x;
int tmp=f[x];
f[x]=find(f[x]);
v[x]=(v[x]+v[tmp])%;
return f[x];
} int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=m;i++) scanf("%d%c%d",&a[i],&c[i],&b[i]);
int tot = ,cnt = ,l = ;
memset(ans,,sizeof(ans));
for(int i=;i<n;i++){
bool flag=true;cnt=;
for(int j=;j<=n;j++) f[j]=j,v[j]=;
for(int j=;j<=m;j++){
if(a[j]==i || b[j]==i) continue;
int fx=find(a[j]),fy=find(b[j]);
if(c[j]=='>'){
if(fx==fy && (v[a[j]]+-v[b[j]])%!=) flag=false,cnt=j;
else{
f[fx]=fy;
v[fx]=(-v[a[j]]++v[b[j]])%;
}
}else if(c[j]=='<'){
if(fx==fy && (v[a[j]]+-v[b[j]])%!=) flag=false,cnt=j;
else{
f[fx]=fy;
v[fx]=(-v[a[j]]++v[b[j]])%;
}
}else{
if(fx==fy && (v[a[j]]+-v[b[j]])%!=) flag=false,cnt=j;
else{
f[fx]=fy;
v[fx]=(-v[a[j]]+v[b[j]])%;
}
}
if(!flag) break;
}
if(flag) ans[++tot]=i;
l=max(l,cnt);
}
if(tot==) puts("Impossible");
else if(tot>) puts("Can not determine");
else printf("Player %d can be determined to be the judge after %d lines\n",ans[],l);
}
return ;
}

POJ2912:Rochambeau(带权并查集)的更多相关文章

  1. POJ - 2912 Rochambeau (带权并查集+枚举)

    题意:有N个人被分为了三组,其中有一个人是开了挂的.同组的人的关系是‘=’,不同组的人关系是‘<’或'>',但是开了挂的人可以给出自己和他人任意的关系.现在要根据M条关系找出这个开了挂的人 ...

  2. poj2912(带权并查集+枚举)

    题目链接:http://poj.org/problem?id=2912 题意:给n个人,m组关系,玩石头剪刀布的游戏,n个人中除一个人judge以外,其他人属于3个group(即石头.剪刀.布),他们 ...

  3. POJ 2912 Rochambeau(难,好题,枚举+带权并查集)

    下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7 题意:有N个人玩剪刀石头布, ...

  4. [poj 2912] Rochambeau 解题报告 (带权并查集)

    题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...

  5. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

  6. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  7. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  8. poj1984 带权并查集(向量处理)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5939   Accepted: 2 ...

  9. 【BZOJ-4690】Never Wait For Weights 带权并查集

    4690: Never Wait for Weights Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 41[Submit][ ...

随机推荐

  1. go web cookie和session

    cookie是存储在浏览器端,session是服务器端 cookie是有时间限制的,分会话cookie和持久cookie,如果不设置时间,那周期就是创建到浏览器关闭为止.这种是会话cookie,一般保 ...

  2. Linux中程序的编译和链接过程

    1.从源码到可执行程序的步骤:预编译.编译.链接.strip 预编译:预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. 编译: 编译器来执行.把源码.c .S编程机器码. ...

  3. 分享一个工作中遇得到的sql(按每天每人统计拖车次数与小修次数)

    查询每人每天的数据 首先先建表 CREATE TABLE `user` ( `name` ) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CR ...

  4. LeetCode:26. Remove Duplicates from Sorted Array(Easy)

    1. 原题链接 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/ 2. 题目要求 给定一个已 ...

  5. 4.HBASE数据迁移方案(之snapshot):

    4.HBASE数据迁移方案:  4.1 Import/Export  4.2 distcp  4.3 CopyTable  4.4 snapshot 快照方式迁移(以USER_info:user_lo ...

  6. Mysql 启动运行

    MYSQL默认端口:3306用户: root   也可自己添加用户启动数据库服务名: MYSQL (在安装的时候会设置) 在开始菜单栏->附件->右键命令提示符->以管理员身份运行: ...

  7. fiddler抓包工具的基本使用

    fiddler是基于C#的HTTP抓包工具. fiddler的原理: fiddler是http代理服务器,它会抓取浏览器向服务器发送的HTTP请求,然后在将该请求发送到服务器.再获取从服务器返回的请求 ...

  8. python,批量生成指定格式的审核数据(传输参数格式为数组时)

    #思路#获取list长度(例如列表有20条数据,则生成20条数据),生成数组长度为list元素的数据,完成对列表20条数据的批量审核def createBatchData(self,str_in,li ...

  9. python3.x 编码问题

  10. mysql数据库----Pymysql

    本节重点: pymysql下载和使用 sql注入 增.删.改:conn.commit() 查:fetchone.fetchmany.fetchall 一.pymysql的下载和使用 之前我们都是通过M ...