题意:有n个孩子玩"石子剪刀布",有3组,每一组在每一轮游戏中的孩子出的手势是一样,但在他们其中有一个judge出的手势是随意。经过m次游戏,问你能否找出这个judge的孩子。

分析:此题是3个制约关系,很容易想到poj中食物链的那道题,也是形成3个制约关系。可以直接套公式:Rank[x]=(Rank[y]-Rank[x]+d-1+3)%3(1<=d<=3).那么怎么找出judge呢?

由于数据不大,可以对每个孩子枚举。由于judge是不满足上述的制约。所以出掉judge,上述关系依然成立。若只有一个人满足,就可以确定,输出最早能判断的游戏次数。如果有多个就不能确定输出Can not determind.如果没有一个人,输出Impossible。稍微难理解的是:怎样输出最早能确定的游戏次数?,如果号码为i的孩子所建立的制约关系在j次游戏出错,那么就是第j次游戏judge不满足,而judge都要满足,那么他就是在其他不是judge的孩子所出错最大的游戏次数,好好想想!

输入有点坑!中间没有空格。

#include<cstdio>
#include<cstring>
#define max(x,y) x>y?x:y;
const int N=2005;int n,m,ans,Max;
int father[N],Rank[N];
int x[N],y[N],d[N];void Init(int n)
{for(int i=0;i<n;i++){father[i]=i;Rank[i]=0;}
}int Find(int x)
{if(x==father[x]) return x;else{int tmp=father[x];father[x]=Find(tmp);Rank[x]=(Rank[x]+Rank[tmp])%3;}return father[x];
}void Union(int x,int y,int d)
{int fx,fy;fx=Find(x);fy=Find(y);father[fx]=fy;Rank[fx]=(Rank[y]-Rank[x]+3+d)%3;
}int Judge()
{bool flag;int p=0,fx,fy;ans=0,Max=0;for(int i=0;i<n;i++){Init(n);flag=1;for(int j=0;j<m;j++){if(x[j]==i||y[j]==i) continue;fx=Find(x[j]),fy=Find(y[j]);if(fx==fy){if(Rank[x[j]]!=(Rank[y[j]]+d[j])%3){flag=0;Max=max(Max,j+1);break;}}else Union(x[j],y[j],d[j]);}if(flag) p++,ans=i;if(p>1) return p;}return p;
}int main()
{int a,b,i,j,k;char op[10];while(scanf("%d %d",&n,&m)!=EOF){for(i=0;i<m;i++){scanf("%s",op);int len=strlen(op);for(j=0;j<len;j++){if(op[j]=='='||op[j]=='<'||op[j]=='>'){if(op[j]=='=') d[i]=0;else if(op[j]=='<') d[i]=1;else d[i]=2;break;}}int v=0;for(k=0;k<j;k++){v=v*10+(op[k]-'0');}x[i]=v;v=0;for(k=j+1;k<len;k++){v=v*10+(op[k]-'0');}y[i]=v;}int p=Judge();if(p==0) puts("Impossible");else if(p==1) printf("Player %d can be determined to be the judge after %d lines\n",ans,Max);else puts("Can not determine");}return 0;
}

并查集-POJ2912 Rochambeau相关推荐

  1. 【转】并查集MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 ...

  2. Rochambeau POJ - 2912 (枚举和加权并查集+路径压缩)找唯一裁判

    题意:有n个人玩石头剪刀布,有且只有一个裁判.除了裁判每个人的出拳形式都是一样的. a<b表示b打败a,a=b表示a和b出拳一样,平手.a>b表示a打败b. 给出m个回合的游戏结果,问能否 ...

  3. poj2912(种类并查集+枚举)

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

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

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

  5. 树形结构 —— 并查集

    [概述] 并查集(Union-Find Set)是一种用于分离集合操作的抽象数据类型,其处理的是集合(set)之间的关系,一般处理的是图的连通分量,当给出两个的元素的一个无序对 (a,b) 时,需要快 ...

  6. POJ 并查集 题目汇总 ——czyuan原创(转)

    继续数据结构的复习,本次的专题是:并查集. 并查集,顾名思义,干的就是"并"和"查"两件事.很多与集合相关的操作都可以用并查集高效的解决. 两个操作代码:    ...

  7. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  8. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  9. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

最新文章

  1. 修改SQL SERVER内置存储过程
  2. 解决text-overflow: ellipsis;不生效的问题
  3. 电脑学习方法_怎样快速学习和熟悉电脑知识?|从小白到大神的快捷方法
  4. 互联网常识(持续更新)
  5. 你真的了解泛型 Generic 嘛?
  6. Connected to an idle instance问题的小小仇恨
  7. java中能构成循环的语句_《编程导论(Java)#183;3.2.4 循环语句》
  8. C++类中protected访问权限问题
  9. python实现斐波那契数列
  10. 如何将外链接向内连接转换?
  11. 陈皓:谈谈职业规划——CSDN对我的采访
  12. 点击EditText可编辑,点击其他地方不可编辑
  13. Illustrator 教程,如何在 Illustrator 中创建颜色渐变?
  14. 店铺DRS评分这样来做|盛天海电商
  15. 【工业互联网】郭朝晖:工业互联网平台背景下的工业大数据与智能制造
  16. 微软搜索战略全盘革新 计划数月内发布“Kiev”
  17. office2007word不能插入页码解决办法
  18. 操作系统-软件架构设计
  19. HDOJ 1846 Brave Game(巴士博弈)
  20. 洛谷 | P1226 【快速幂】

热门文章

  1. 数据库实验5 数据库设计实验
  2. 法大大首批通过ISO 22301:2019认证
  3. L298n控制步进电机
  4. 揭开木马的神秘面纱 1
  5. md5加密一转眼就要毕业了
  6. JAVA文法bnf_关于java:BNF命题逻辑ANTLR的语法
  7. 西邮Linux兴趣小组2022纳新面试题题解
  8. html动画效果怎么做成桌面效果,11款效果惊艳的HTML5动画应用
  9. angularjs还有前景吗_卡奇乐:在大城市投资儿童乐园还有市场前景吗
  10. 南师大计算机学科评估排名,南京师范大学a类b类学科有哪些?附南京师范大学第四轮学科评估结果...