poj2912 带权并查集
2015-09-07 23:18
274 查看
题意:多个人玩石头剪刀布,每个人提前选定了自己出哪个手势,而其中有一种特殊的人他可以随意出什么手势,问是否能够从给出的一系列石头剪刀布游戏中判断出哪个是特殊的,可以从第几局游戏中判断出来。
首先按照食物链那题的做法,定 0,1,2 做为三种手势就可以了,不过由于判断是哪个人比较麻烦,不知道哪个人的选择是无效的,就不知道那几次游戏是不正确不能加入并查集的,因此就直接暴力枚举每个人是否为特殊的人,对于涉及这个人的所有游戏都不进行并查集操作,看剩下的游戏中是否会有矛盾,如果有就说明这个人不是特殊的人,否则他就可能是。最后如果只有一个人可能是,就可以判读出来,而判断出来的局数,就是枚举其他所有人出现矛盾的游戏场次的最大值,因为只有否定完其他所有人才能确定这个人是特殊的。
View Code
首先按照食物链那题的做法,定 0,1,2 做为三种手势就可以了,不过由于判断是哪个人比较麻烦,不知道哪个人的选择是无效的,就不知道那几次游戏是不正确不能加入并查集的,因此就直接暴力枚举每个人是否为特殊的人,对于涉及这个人的所有游戏都不进行并查集操作,看剩下的游戏中是否会有矛盾,如果有就说明这个人不是特殊的人,否则他就可能是。最后如果只有一个人可能是,就可以判读出来,而判断出来的局数,就是枚举其他所有人出现矛盾的游戏场次的最大值,因为只有否定完其他所有人才能确定这个人是特殊的。
#include<stdio.h> #include<string.h> const int maxm=505; int fa[maxm],num[maxm],wa[maxm]; struct ques{ int a,b,c; }q[2005]; void init(int n){ for(int i=0;i<=n;++i){ fa[i]=i; num[i]=0; } } int find(int x){ int r=x,t1,t2,c=0; while(r!=fa[r]){ c+=num[r]; r=fa[r]; } while(x!=r){ t1=fa[x]; t2=c-num[x]; num[x]=c%3; fa[x]=r; c=t2; x=t1; } return r; } int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=m;++i){ char c; scanf("%d",&q[i].a); c=getchar(); while(c!='='&&c!='<'&&c!='>')c=getchar(); if(c=='=')q[i].c=0; else if(c=='<')q[i].c=1; else if(c=='>')q[i].c=2; scanf("%d",&q[i].b); } memset(wa,-1,sizeof(wa)); for(int i=0;i<n;++i){ init(n); for(int j=1;j<=m;++j){ if(q[j].a==i||q[j].b==i)continue; int x=find(q[j].a),y=find(q[j].b); if(x!=y){ fa[x]=y; num[x]=((num[q[j].b]+q[j].c-num[q[j].a])%3+3)%3; } else{ if((num[q[j].b]+q[j].c)%3!=num[q[j].a]){wa[i]=j;break;} } } } int cnt=0,ans1,ans2=0; for(int i=0;i<n;++i){ if(wa[i]==-1){ cnt++; ans1=i; } if(wa[i]>ans2)ans2=wa[i]; } if(!cnt)printf("Impossible\n"); else if(cnt>1)printf("Can not determine\n"); else printf("Player %d can be determined to be the judge after %d lines\n",ans1,ans2); } return 0; }
View Code
相关文章推荐
- uva 1376 - Animal Run(最短路)
- nyoj 86 找球号(一)【二分查找】
- Linux搭建SVN服务器
- 零基础学python-12.2 关键字pass,else,break,continue
- main restricted universe muitiverse
- JSON详解 .net
- 零基础学python-12.2 关键字pass,else,break,continue
- hdu 1503 Advanced fruits
- BookKeeper
- 犀牛——第9章类和模块 9.1类和原型
- 小程序-----输出字符串中的中文字符
- sublime编译java
- 【转】Android Google Map API使用的八个步骤
- Python调用打印机参考例子
- C语言用二维数组实现开关灯泡游戏
- android webView与js交互
- 嵌入式设备时间同步管理
- uva 1357 - Cells(dfs)
- hdu(5430)——Reflect(数学题)
- debian8对指纹,触摸,摄像头的支持和使用