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

题意:有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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C标准输出流

标准输入流对象cin&#xff0c;重点掌握的函数: cout.flush()//刷新缓冲区 cout.put()//向缓冲区写字符 cout.write()//二进制流的输出 cout.width()//输出格式控制 cout.fill() cout.set(标记) cout.flush() 代码如下: #include <iostream> using namespace std;void…

Autofac在.NET Core 中的使用

前言Autofac 是一款.NET IoC 容器 . 它管理类之间的依赖关系, 从而使应用在规模及复杂性增长的情况下依然可以轻易地修改 。.NET CORE 中也内置了依赖注入&#xff0c;但是有些情况下需要用到Autofac去进行依赖注入&#xff0c;Autofac支持的所有注入方式以外&#xff0c;还支持…

Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)

题目大意&#xff1a;给两个数a&#xff0c;b&#xff0c;求满足c*da且c>b且d>b的c,d二元组对数&#xff0c;(c,d)和(d,c)属于同一种情况 题目分析&#xff1a;根据唯一分解定理先将a唯一分解&#xff0c;则a的所有正约数的个数为ans (1 a1) * (1 a2) *...(1 an) 因为…

C++文本文件操作和二进制文件读写

文本文件操作: 代码如下: #include <iostream> #include <fstream> using namespace std;void test01() {const char *fileName "C:\\Users\\Tom\\Desktop\\hhh.txt";//ifstream ism(fileName, ios::in);//只读方式打开文件ifstream ism;ism.open(file…

java类结构工具_java类层次结构图工具

Java主类结构_计算机软件及应用_IT/计算机_专业资料。Java主类结构 谢谢大家! Java主类结构 谢谢大家! 申请认证 文档贡献者 胸兢谙韶硛蠌 中西医 59981 ......知识结构类思维导图模板:java知识结构。{"code":&...所有这些都遵从 Spring 的通用事务和 DAO 异常层…

详解.NET Core 依赖注入生命周期

前言.NET Core 自带依赖注入框架&#xff0c;支持三种不同生命周期的注入模式&#xff1a;Singleton 单例模式Scoped 区域模式Transient 瞬时模式但是常常不知道什么时候使用哪种模式才最合适&#xff0c;接下来我就用代码详细解读一下三种模式代码示例首先新建.NET Core API…

[C++STL]string容器用法介绍

string构造函数 代码如下: #include <iostream> #include <string> using namespace std;void test01() {string s1;cout << "s1 " << s1 << endl;const char *str "hello world";string s2(str);cout << "s2…

LightOJ-1220 Mysterious Bacteria (素数打表+欧几里得算法+唯一分解定理)给出x,求x=a^p,最大的指数

题目大意&#xff1a; x b^p, x只有一个因子的p次幂构成 如果24 2^3*3^1&#xff0c;p应该是gcd(3, 1) 1,即24 24^1 324 3^4*2^2(3^2*2)^2,p应该是gcd(4, 2) 2,即324 18^2 所以p gcd(x1, x2, x3, ... , xn){欧几里得算法求取最大公约数}; *本题有一个坑&#xff0c;就…

致敬平凡的程序员--《SOD框架“企业级”应用数据架构实战》自序

“简单就是美”“平凡即是伟大”上面两句话不知道是哪位名人说的&#xff0c;又或者是广大劳动人民总结的&#xff0c;反正我很小的时候就常常听到这两句话&#xff0c;这两句话也成了我的人生格言&#xff0c;而且事实上我也是一个生活过得比较简单的平凡人物&#xff0c;当然…

[C++STL]vector容器用法介绍

代码如下&#xff1a; #include <iostream> #include <string> #include <vector> using namespace std;void printVector(vector<int >&v) {for (vector<int>::iterator it v.begin(); it ! v.end(); it){cout << *it << &qu…

跟沈剑学习如何带领技术团队作战

【学习笔记】| 作者/Edison Zhou这是恰童鞋骚年的第229篇原创文章小编Edison在阿里云开发者社区上看到了58集团技术VP大佬沈剑关于如何带领技术团队作战的一个直播分享&#xff0c;因此在站地铁的上下班路上学习完了整个录播视频&#xff0c;整理总结下此文作为学习笔记&#x…

拓展欧几里得小结(初级理解)

什么是拓展欧几里得&#xff1f;简单的说&#xff0c;就是求关于x,y的方程 ax by gcd(a,b) 的所有整数解 现在我们令g gcd(a,b)则方程变成了ax by g 假如我们现在知道了关于这个方程的一个特解x0, y0&#xff0c;我们就可以用一种方法求出所有的整数解。 说的比较模糊&am…

用java做一个模拟彩票程序_JAVA模拟----- 彩票机子-----抽奖过程的实例化

/*时间&#xff1a;2012-10-05作者&#xff1a;烟大阳仔程序要求&#xff1a;模拟彩票抽奖机的功能编写一个程序,实现随即输出六个号码程序解释&#xff1a;该段程序没有传递参数*/class Day1005_Caipiao{public static void main(String[] args){System.out.println("估计…

[C++STL]deque容器用法介绍

代码如下&#xff1a; #include <iostream> #include <string> #include <deque> using namespace std;void printDeque(const deque<int>& d) {for (deque<int>::const_iterator it d.begin(); it ! d.end(); it){cout << *it <…

“我工作八年,换了四家小公司,今后的职业生涯该怎么走?”

去年&#xff0c;我曾在GIAC大会上分享过一个有关程序员职场变化和转型的话题。在分享结束之后&#xff0c;有一位小伙伴拦在大门口&#xff0c;问了我一个问题&#xff1a;"王老师&#xff0c;虽然你分享的内容很务实&#xff0c;落地性也很强&#xff0c;但我觉得跟自己…

最长回文 HDU - 3068(求最长回文串的长度【马拉车算法Manacher】)

马拉车算法 Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法&#xff0c;由一个叫 Manacher 的人在 1975 年发明的&#xff0c;这个方法的最大贡献是在于将时间复杂度提升到了线性 dp[i] ma > i ? min(dp[2 * mod - i], ma - i) : 1; 可以这么说&…

java中的循环结构_Java中的循环结构进阶

循环结构进阶学习本章用到的单词triangle:三角形circle:圆形diamond:钻石password:密码row:行.排列二重循环结构简单的说:二重循环就是一个循环体内又包含另一个完整的循环结构.while循环结构,do-while循环结构,for循环结构三种循环结是可以相互嵌套的语法://while与while循环嵌…

.NET Core + Kubernetes:Deployment

在上篇文章 .NET Core Kubernetes&#xff1a;Pod 中&#xff0c;主要介绍了 Pod 的相关内容&#xff0c; 基于 Pod 为单位能更加合理进行容器编排&#xff0c;然而 Pod 只是个启动了一个或一组容器的资源类型&#xff0c;在实际应用中&#xff0c;我们也需要 Pod 能实现动态扩…

java dos平台压缩_Dos命令 压缩 解压缩

你的机器 有RAR吗> 装个rar里面有个Rar.exe文件用法: rar - - a 添加文件到压缩文件c 添加压缩文件注释cf 添加文件注释cw 写入压缩文件注释…