POJ2912:Rochambeau(带权并查集)
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(带权并查集)的更多相关文章
- POJ - 2912 Rochambeau (带权并查集+枚举)
题意:有N个人被分为了三组,其中有一个人是开了挂的.同组的人的关系是‘=’,不同组的人关系是‘<’或'>',但是开了挂的人可以给出自己和他人任意的关系.现在要根据M条关系找出这个开了挂的人 ...
- poj2912(带权并查集+枚举)
题目链接:http://poj.org/problem?id=2912 题意:给n个人,m组关系,玩石头剪刀布的游戏,n个人中除一个人judge以外,其他人属于3个group(即石头.剪刀.布),他们 ...
- POJ 2912 Rochambeau(难,好题,枚举+带权并查集)
下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7 题意:有N个人玩剪刀石头布, ...
- [poj 2912] Rochambeau 解题报告 (带权并查集)
题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- [NOIP摸你赛]Hzwer的陨石(带权并查集)
题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...
- poj1417 带权并查集 + 背包 + 记录路径
True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2713 Accepted: 868 Descrip ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- 【BZOJ-4690】Never Wait For Weights 带权并查集
4690: Never Wait for Weights Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 88 Solved: 41[Submit][ ...
随机推荐
- 谷歌面试官经典作品(CTCI)目录
1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个 ...
- 使用apache的ab压力测试时失败请求原因
只要出现 Failed requests 就会多出现一行要求失败的各原因的数据统计,分别有 Connect, Length,与 Exception 三种,分别代表的意义为:Connect 无 ...
- centos redis 安装 php-redis扩展安装 及使用
前提:centos7.php7 安装redis-server 1:yum install redis 编译安装php-redis 扩展 1:下载编译安装 wget https://codeload.g ...
- 【数据库】 SQL 常用语句之系统语法
[数据库] SQL 常用语句之系统语法 1. 获取取数据库服务器上所有数据库的名字 SELECT name FROM master.dbo.sysdatabases 2. 获取取数据库服务器上所有非系 ...
- 「日常训练」Phone Numbers (CFR466D2C)
题意(Codeforces 940C) 给定一字符串,求比它字典序大的字符串.限定其长度,并且只能用原串的字母. 分析 考虑原串长度lorigin与给定的长度lgiven.若给定长度大于原串长度,直接 ...
- 第十五篇 Python之文件处理
一 文件操作 介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所 ...
- 监控memcache服务
监控memcache服务是否正常,模拟用户(web客户端)检测. 使用nc命令加上set/get来模拟检测,以及监控响应时间及命中率. #!/bin/bash #################### ...
- chrome提示Adobe Flash Player过期解决
安装插件:install_flash_player_ppapi.exe
- gitbook.explore更新升级了, 不能再搜索了
www.gitbook.com/explore 不再是一个索引页面 Can I browse existing projects on GitBook ? The new version of Git ...
- 一个简单的NetCore项目:1 - 搭建框架,生成数据库
1- 启动项目 安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了.简单粗暴的方式就是安装最新的VS2015. 2-搭建框架 2.1 打开VS新建一个项目,在弹出的新建项目对话框中, ...