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

题目:

题目大意:

n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000)

接下来m行形如x,y,ch的输入,ch='='表示x,y平局, ch='>'表示x赢y,ch='<'表示x输y, 但是我们不知道x,y的手势是什么;

其中有一个人是裁判,它可以出任意手势,其余人手势相同的分一组,共分为三组,可以存 在空组。

也就是说除了裁判外,其余人每一次出的手 势都相同,问能不能确定裁判是几号,如果能,输出 最少在第几轮可以确定;

题解:

带权并查集

我们考虑枚举裁判,然后对每轮进行处理,包含当前枚举的裁判的轮我们直接跳过

二者之前的关系我们用0(=),1(>),2(<)表示,记得%3,用val数组记录当前点到所在并查集根节点的关系

对于每轮,我们首先判断是否在同一联通块里。如果在,判断当前关系是否符合,即val[b]是否等于val[a]+ch(我们定义ch是b连向a的),如果是就继续,不是的话说明当前的点不是裁判;如果不在,就带权合并一下就好了

那么最少的发现裁判的轮数呢?我们发现我们实际上在做一个排除法,那么我们最晚排除的那个人的轮数就是最少的发现裁判的轮数

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std; const int N=+;
const int M=+;
int n,m;
int fa[N],a[M],b[M],ch[M],val[N];
int find(int x)
{
if (fa[x]==-) return x;
int tmp=find(fa[x]);
val[x]+=val[fa[x]];
val[x]%=;
return fa[x]=tmp;
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
char c[];
for (int i=;i<=m;i++)
{
scanf("%s",c+);
a[i]=b[i]=;
int len=strlen(c+);
int l=;
while (c[l]>=''&&c[l]<='') a[i]=(a[i]<<)+(a[i]<<)+c[l]-'',l++;
if (c[l]=='=') ch[i]=;
if (c[l]=='>') ch[i]=;
if (c[l]=='<') ch[i]=;
l++;
while (c[l]>=''&&c[l]<=''&&l<=len) b[i]=(b[i]<<)+(b[i]<<)+c[l]-'',l++;
//printf("%d %d %d\n",a[i],ch[i],b[i]);
}
int round=,judger=-;
bool mark=false;
for (int i=;i<n;i++)
{
bool flag=false;
memset(fa,-,sizeof(fa));
memset(val,,sizeof(val));
for (int j=;j<=m;j++)
{
if (a[j]==i||b[j]==i) continue;
int fx=find(a[j]),fy=find(b[j]);
if (fx==fy)
{
if (val[b[j]]!=(val[a[j]]+ch[j]+)%)
{
round=max(round,j);
flag=true;
break;
}
}
else
{
fa[fy]=fx;
val[fy]=(val[a[j]]+ch[j]-val[b[j]]+)%;
}
}
if (!flag)//当前的是法官
{
if (judger==-)
{
judger=i;
}
else
{
mark=true;
break;
}
}
}
if (mark) printf("Can not determine\n");
else if (judger==-) printf("Impossible\n");
else printf("Player %d can be determined to be the judge after %d lines\n",judger,round);
}
return ;
}

[poj 2912] Rochambeau 解题报告 (带权并查集)的更多相关文章

  1. POJ 2912 - Rochambeau - [暴力枚举+带权并查集]

    题目链接:http://poj.org/problem?id=2912 Time Limit: 5000MS Memory Limit: 65536K Description N children a ...

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

    题目链接:http://poj.org/problem?id=2912 题意:多个人玩石头剪刀布分成3组和一个裁判,每一组提前选定了自己出哪个手势,裁判可以随意出什么手势,问是否能够从给出的一系列石头 ...

  3. POJ 2912 Rochambeau(暴力)+【带权并查集】

    <题目链接> 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000),接下来m行形如x, y, ch的输入,ch='='表示x, y平局 ...

  4. POJ 1988 Cube Stacking( 带权并查集 )*

    POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...

  5. poj 1733 Parity game(带权并查集+离散化)

    题目链接:http://poj.org/problem?id=1733 题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息, ...

  6. POJ 1988 Cube Stacking 【带权并查集】

    <题目链接> 题目大意: 有几个stack,初始里面有一个cube.支持两种操作: 1.move x y: 将x所在的stack移动到y所在stack的顶部. 2.count x:数在x所 ...

  7. POJ 1733 Parity game 【带权并查集】+【离散化】

    <题目链接> 题目大意: 一个由0,1组成的序列,每次给出一段区间的奇偶,问哪一条信息不合法. 解题分析: 我们用s[i]表示前i个数的前缀和,那么a b even意味着s[b]和s[a- ...

  8. POJ 1733 Parity game(离散化+带权并查集)

    离散化+带权并查集 题意:长度为n的0和1组成的字符串,然后问第L和R位置之间有奇数个1还是偶数个1. 根据这些回答, 判断第几个是错误(和之前有矛盾)的. 思路:此题同HDU 3038 差不多,询问 ...

  9. POJ:1182 食物链(带权并查集)

    http://poj.org/problem?id=1182 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1 ...

随机推荐

  1. POJ 3696

    这里面的一个转换的小技巧很重要,把888...8转换成(10^x-1)/9*8.神来之笔,佩服. 这样有(10^x-1)/9*8=L*p得10^x-1=L*p*9/8,设m=9*L/gcd(L,8). ...

  2. Could not connect to SMTP host: localhost, port: 25;

    1.错误描写叙述 DEBUG: setDebug: JavaMail version 1.3.3 DEBUG: getProvider() returning javax.mail.Provider[ ...

  3. php给图片加入文字水印

    PHP对图片的操作用到GD库.这里我们介绍怎样给图片加入文字水印. 大致分为四步: 1.打开图片 2.操作图片 3.输出图片 4.销毁图片 以下我们上代码来详细解说每步的实现过程: <? php ...

  4. 【MVC架构】——怎样利用Json在View和Controller之间传递数据

    在MVC架构中,尽管非常多东西和三层非常相似,可是也有非常大的差别.就比方传递数据.在三层架构中,传递数据就仅仅要一层返回,另外一层用同样类型的变量来接收即可了.在MVC中,事实上原理是一样的,Con ...

  5. elasticsearch的javaAPI之index

    Index API 原文:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/index_.html ...

  6. &quot;singleTask&quot;模式 切换到新的栈中

    本文截取了网络资源的结论部分 对singletask 启动模式做笔记记录. 尽管SubActivity的launchMode被设置为"singleTask"模式,可是它并不像官方文 ...

  7. C/S和B/S交互

    近期一直在做C/S的项目,每天都超忙,抽个时间写篇博客,之前一直做C/S项目就是各种窗口.各种控件,拖来拖去,然后点进去写方法,做BS的时候呢,由于一直使用的是mvc,所以就是常常手写代码.或者拖引用 ...

  8. awk双文件互相匹配查找

    awk双文件互相匹配查找 要求: 文件a:  10/05766798607,11/20050325191329,29/0.1,14/05766798607  10/05767158557,11/200 ...

  9. 高斯滤波及高斯卷积核C++实现

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,在图像处理的降噪.平滑中应用较多,特别是对抑制或消除服从正态分布的噪声非常有效. 高斯滤波的过程其实就是对整幅图像进行加权平均操作的过程.滤波后图像上每 ...

  10. JavaScript学习——JS事件总结

    回顾之前已经使用过的事件 (onsubmit.onclick.onload.onfocus.onblur.onmouseover.onmouseout) onfocus/onblur:聚焦离焦事件,用 ...