题意:有n个人玩石头剪刀布,有且只有一个裁判。除了裁判每个人的出拳形式都是一样的。
a<b表示b打败a,a=b表示a和b出拳一样,平手。a>b表示a打败b。
给出m个回合的游戏结果,问能否判断出谁是裁判?如果能还要输出是在哪个回合之后判断出谁是裁判。分析:枚举和加权并查集+路径压缩。
对于每个人假设其为裁判,然后去掉所有和他有关的匹配,判断是否会出现矛盾。
w[i]=0:i和根节点属于同一集合;w[i]=1:根节点打败i;w[i]=2:i打败根节点
在寻找根节点的find()函数中,w的更新函数是:w[x]=(w[x]+w[s[x]])%3;
举个例子:找到根节点之前w[x]=1,val[s[x]]=2:表示父节点打败x,父节点也打败父节点的父节点。
(注意此时w[x]是x与父节点的关系)
所以按照递归的思路,从递归倒数第二层开始s[x]就表示为根节点了,那么pre[x]打败根节点。
又因为s[x]也打败x所以w[x]=0=(1+2)%3;递归在往上一层时pre[x]又表示为根节点了。
再来看看合并操作时的w关系。
fa,fb分别为aa,bb的根节点,ww是aa与bb的关系。
当fa!=fb时,令s[fa]=fb.
假设w[aa]=1,即fa打败aa①,w[bb]=2,即bb打败fb②,ww=1,即bb打败aa③。
则由②③的aa和fb是同一集合。再由①得fa打败fb。即w[fa]=2.
也就是w[fa]=(w[bb]-w[aa]+ww)%3,
但是由于有可能w[bb]-w[aa]+ww<0,所以正确的方程是:w[fa]=(w[bb]-w[aa]+ww+3)%3,
当fa==fb时,那么就要判断是否出现矛盾,如果出现矛盾那么说明i不能作为裁判。
判断矛盾是:(w[aa]-w[bb]+3)%3和ww是否相等。
如果不矛盾,那么就接着读入输入到最后。
还要注意一点就是可能会出现多个裁判,那就是Can not determine。

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

题意分析:简单来说,就是,m个人中有且只有一个裁判,每次枚举一个人不参与出拳,看是否出现矛盾,若有,

则有且只有m-1次出现矛盾才能找到裁判。

AC代码分步详细分解

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define M 500+10
#define N 2000+10
struct node///开结构体,记录每一行u,v和他们之间的关系k
{int u,v,k;
} q[N];
int s[M];///s[x]并查集记录x的父节点s[x]
int w[M];///w[x]两节点的关系权值0,1,2,表示x和根节点的关系
int dp[M];///记录出现矛盾的行数
int n,m;
int Find(int x)/*找到x的父节点*/
{if(x==s[x])return x;int temp=s[x];s[x]=Find(temp);w[x]=(w[x]+w[temp])%3; ///回溯更新与父节点的关系return s[x];
}
int main()
{while(~scanf("%d%d",&n,&m)){int i,j,k,u,v;char e;for(i=1; i<=m; ++i){scanf("%d%c%d",&q[i].u,&e,&q[i].v);if(e=='>')// y吃xq[i].k=2;else if(e=='<') // x吃yq[i].k=1;else if(e=='=') //同类q[i].k=0;}memset(dp,-1,sizeof(dp));for(i=0; i<n; i++)///枚举每个人{memset(w,0,sizeof(w));for(int i=0; i<n; ++i)s[i]=i;//注意这里要初始化,因为每次建立的关系都有可能不一样for(j=1; j<=m; ++j){if(q[j].u==i||q[j].v==i) ///枚举:屏蔽裁判continue;u=q[j].u,v=q[j].v,k=q[j].k;///k为u,v之间的关系int fx=Find(u),fy=Find(v);///fx,fy分别 u,v的根节点if(fx!=fy)///如果两个节点的boss不是一个人,那么就要建立关系。{/**起始w均为零,则k的关系,即为u,v之间的关系*/s[fy]=fx; /**单纯表示连通,fx(u的父节点)放在左子树上,fy(v的父节点)为根,u的父节点与v的父节点关系由w[fy]记录*/w[fy]=(w[u]+k+3-w[v])%3;///(w[u]表示父节点fx与u的关系)(w[v]表示fy与v的关系)由k的值判定u与v的关系}///但是由于有可能 w[u]+k+-w[v]<0,所以正确的方程是: w[fy]=(w[u]+k+3-w[v])%3,else///如果两个节点boss相同就要考虑ab的关系权值是否与节点间原来的关系权值是一样的,如果不一样,那么这个人就不是裁判,同时记录下错是错在第多少组数据{if((w[v]+3-w[u])%3!=k)//出现矛盾{dp[i]=j;//标记出现矛盾所在行break;}}}}int cnt=0,ans=0;for(i=0; i<n; ++i){if(dp[i]==-1)cnt++,v=i;ans=max(ans,dp[i]);///判断边最大的矛盾边(即此时才可以保证当枚举去除任何一个人,都可以发现矛盾)}if(!cnt)printf("Impossible\n");else if(cnt>1)printf("Can not determine\n");else if(cnt==1)/**即当枚举去除裁判,有且只有当去除真正的裁判,才不会发生矛盾*/printf("Player %d can be determined to be the judge after %d lines\n",v,ans);}return 0;
}

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

  1. 并查集路径压缩_并查集(UnionFind)技巧总结

    什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(Union-find Algorithm)定义了两个用 ...

  2. 并查集 路径压缩(具体解释)

    拿HDU 1232举例. 题解: 首先在地图上给你若干个城镇,这些城镇都能够看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比方任意给你两个点.让你推断它们是否连 ...

  3. 并查集路径压缩_第二十五天:并查集

    今天是释然发题解的第二十五天,以后会经常和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣 本文约1400字,预计阅读5分钟 昨天我们学习了动态规划之线性规划,忘记的小伙伴们可以 ...

  4. Never Wait for Weights(带权并查集+路径压缩)

    题目链接:http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2209#problem/F !a b w 表示b比a大w ?  a b  输出 ...

  5. 并查集路径压缩和按rank合并代码实现

    1.子集结构体:parent为每个子集的根,rank为秩 struct Subset {int parent;int rank; }; 2.初始化: 一开始每个顶点自成一个子集,它们的parent指向 ...

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

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

  7. A Bug‘s Life POJ 2492 加权并查集

    A Bug's Life POJ 2492 加权并查集 传送门:http://poj.org/problem?id=2492 Description Background Professor Hopp ...

  8. hdu 3635 Dragon Balls(加权并查集)2010 ACM-ICPC Multi-University Training Contest(19)

    这道题说,在很久很久以前,有一个故事.故事的名字叫龙珠.后来,龙珠不知道出了什么问题,从7个变成了n个. 在悟空所在的国家里有n个城市,每个城市有1个龙珠,第i个城市有第i个龙珠. 然后,每经过一段时 ...

  9. poj 3728 The merchant// lca(倍增实现) + dp || tarjan+并查集路径上dp

    poj 3728 The merchant// lca(倍增实现) + dp Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: ...

最新文章

  1. Asp.Net MVC2.0 Url 路由入门---实例篇
  2. typora最好用的主题_谁是我心中最好的写作工具?
  3. python去重复元素_python 去除单个list中的重复元素
  4. ​电赛 | 19年全国一等奖,北航学子回忆录(上)
  5. Log4net数据表
  6. 如何通过使用 64 位版本 Windows 查看系统注册表 WOW6432Node
  7. matlab相关性分析频谱_利用Matlab绘制正弦信号的频谱图并做相关分析[共6页]
  8. opencv之绘制多边形----cv2.polylines, cv2.fillPoly
  9. Linux-nginx安装
  10. 杀死提交的hadoop任务
  11. VUE实现输入完当前input后自动跳到下一个input
  12. oracle复合索引第一个字段,复合索引的先决使用条件 - stacktestor的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  13. 第三阶段:数据存储与计算(离线场景):3.2 数据存储hdfs
  14. 腾讯云服务器无限更换ip,腾讯云服务器免费更换IP额度不足利用弹性IP地址更换...
  15. redis之SDS字符串,到底高效在哪里?(全面分析)
  16. 自动化测试平台(十三):接口自动化框架与平台对比及应用场景分析及设计思路分享
  17. python气泡图的地图_基于Python图表绘图系统:matplotlib散点图和气泡图,你了解吗?...
  18. 量化投资学习——股票价格估值模型
  19. 《俗人笔记》之《Java基础语法上》
  20. 抓取网页生成 PDF

热门文章

  1. Android之实现RTL的ViewPager
  2. 剑指offer之求两个链表的第一个公共节点
  3. 贪心算法之用优先队列(priority_queue)实现哈夫曼编码问题
  4. Android之在一个类里面注册Handler发送消息在另外一个类里面接收消息
  5. bootstrap 开源框架demo_5 个接私活必备的 Java 开源项目!
  6. ctf镜子里面的世界_帮大爷干活,他送了我一只鞋子和一手套,又不能穿拿来做什么?哈哈哈|叶子|镜子|虫子|鞋子|棺材...
  7. java 字节序列_java – 这个线程安全的字节序列生成器有什么问题?
  8. python运行时间过长怎么优化_Python性能优化的20条建议
  9. 美丽又实用的欧拉螺线,数学界当之无愧的画家!
  10. 网友半夜差点被沐浴露吓死,众人:原来不止我胆小....