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

题意:给n个人,m组关系,玩石头剪刀布的游戏,n个人中除一个人judge以外,其他人属于3个group(即石头、剪刀、布),他们只能出这一个手势,而judge可以随便出,要求能否找到judge和在第几组关系时能最先找到judge。

思路:poj1182食物链的进阶版,与那题不同的是,这里需要枚举0到n-1,枚举i假设其为judge,然后遍历不包含i的所有关系,如果符合条件,则i就是judge,否则其不是judge,记录其判断出不是judge的那条边line(后面要用),遍历结束之后,如果judge数目num<1,则Impossible,若num>1,则Can not determine,若num=1,则其为judge,但需要输出判断其为judge的最小的line,其实也就是其它非judge判断为非judge的边line的最大值,这里有点巧妙。

   其余的就和食物链一样了,x->y=-1(<),0(=),1(>),且 x->z=(x->y+y->z+4)%3-1,公式自己手动算一下就明白了。

AC代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4
 5 struct node{
 6     int x,y;
 7     char c;
 8 }a[2005];
 9
10 int n,m,root[505],f[505],ans[505],res,num;
11
12 int getr(int k){
13     if(root[k]==k) return k;
14     else{
15         int tmp=root[k];
16         root[k]=getr(root[k]);
17         f[k]=(f[k]+f[tmp]+4)%3-1;
18         return root[k];
19     }
20 }
21
22 int main(){
23     while(~scanf("%d%d",&n,&m)){
24         if(!m){
25             if(n==1)
26                 printf("Player 0 can be determined to be the judge after 0 lines\n");
27             else
28                 printf("Can not determine");
29             continue;
30         }
31         memset(ans,0,sizeof(ans));
32         num=0;
33         for(int i=1;i<=m;++i)
34             scanf("%d%c%d",&a[i].x,&a[i].c,&a[i].y);
35         for(int i=0;i<n;++i){
36             bool flag=true;
37             for(int j=0;j<n;++j)
38                 root[j]=j,f[j]=0;
39             for(int j=1;j<=m;++j){
40                 if(a[j].x!=i&&a[j].y!=i){
41                     int t1=a[j].x,t2=a[j].y,t3,r1,r2;
42                     if(a[j].c=='<') t3=-1;
43                     else if(a[j].c=='=') t3=0;
44                     else t3=1;
45                     r1=getr(t1),r2=getr(t2);
46                     if(r1==r2){
47                         if(f[t1]!=(t3+f[t2]+4)%3-1){
48                             ans[i]=j;
49                             flag=false;
50                             break;
51                         }
52                     }
53                     else{
54                         root[r2]=r1;
55                         f[r2]=(-((t3+f[t2]+4)%3-1)+f[t1]+4)%3-1;
56                     }
57                 }
58             }
59             if(flag)
60                 ++num,res=i;
61         }
62         if(num<1)
63             printf("Impossible\n");
64         else if(num>1)
65             printf("Can not determine\n");
66         else{
67             int Max=0;
68             for(int i=0;i<n;++i)
69                 if(ans[i]>Max)
70                     Max=ans[i];
71             printf("Player %d can be determined to be the judge after %d lines\n",res,Max);
72         }
73     }
74     return 0;
75 }

转载于:https://www.cnblogs.com/FrankChen831X/p/10659338.html

poj2912(带权并查集+枚举)相关推荐

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

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

  2. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  3. 2020CCPC(长春) - Ragdoll(启发式合并+带权并查集)

    题目大意:初始时给出 n 个集合,每个集合中都包含有一个数字,现在要求执行 m 次操作,每次操作分为下列三种类型: 1 x y:在 x 位置新建一个集合,并且放置一个数字 y 2 x y:合并集合 x ...

  4. 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)

    因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...

  5. HDU 5176 The Experience of Love 带权并查集

    The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  6. 2017乌鲁木齐区域赛I(带权并查集)

    #include<bits/stdc++.h> using namespace std; int f[200010];//代表元 long long rl[200010];//记rl[i] ...

  7. POJ1703带权并查集(距离或者异或)

    题意:       有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作 1 D a b 给出a b 两个人不属于同一个帮派 2 A a b 问a b 两个人关系 输出 同一个帮派 ...

  8. POJ1988(带权并查集,搬砖块)

    题意:        可以这样理解,有n快方形积木,一开始都是单独的放到哪,然后有两种操作 1 M a b 把a所在的那一堆落到b所在那一堆的上面(一开始自己是一堆) 2 C a 问a下面有多少个积木 ...

  9. LA3027简单带权并查集

    题意:       有n个点,一开始大家都是独立的点,然后给出一些关系,a,b表示a是b的父亲节点,距离是abs(a-b)%1000,然后有一些询问,每次询问一个节点a到父亲节点的距离是多少? 思路: ...

最新文章

  1. 随心测试_软测基础_005 测试人员工作内容
  2. Nginx-08:Nginx配置高可用
  3. vba二维数组初始化_将工作表数据写入VBA数组
  4. LeetCode 1838. 最高频元素的频数(二分查找)
  5. jquery 获得table 行数
  6. jmeter debug sample不在查看结果树中显示_Jmeter线程组间传递参数
  7. Linux内核启动流程详解
  8. GPU — NVIDIA GPU 架构发展史
  9. 阿里巴巴普惠_阿里巴巴的普惠字体来了,再也不用担心版权问题了。
  10. 大数据是什么?多大的数据叫大数据?
  11. wdcp虚拟主机管理系统注入漏洞
  12. 【游戏逆向】老飞飞怀恋魅力爱玩等老飞飞瞬移分析代码
  13. T00ls Lpk Sethc 首创lpk劫持方式粘滞键后门,体积超小!
  14. w10系统服务器如何创建新用户,关于Win10怎么给本地账户添加管理员权限的讲解...
  15. 启用系统保护是灰色的#win10系统
  16. 强网杯2022 pwn 赛题解析——yakacmp
  17. java如何开发视频软件_使用JAVA编写视频播放器
  18. 【Maven】Maven的安装与下载
  19. 一文带你读懂,这三个交换机层级的区别和联系。
  20. 【BZOJ4716】假摔 二分+暴力

热门文章

  1. 唱好铁血丹心谐音正规_孩子想学唱歌?儿童声乐怎么学才好?
  2. 升级bios_ThinkPad如何升级BIOS?我来教你!
  3. 云平台管理与部署---虚拟化平台-----KVM
  4. android:inputtype有哪些类型,android:inputType参数类型说明
  5. linux文件明明存在却无法vim打开_教你几招,让你vim编辑器变得友善起来(特别水,不要点进来)...
  6. yii引入php文件,Yii2框架中CSS、JS文件引入要领_PHP开发框架教程
  7. abaqus画一个球 python_简单几步,100行代码用Python画一个蝙蝠侠的logo
  8. logstash mysql日期_logstash-input-jdbc取mysql数据日期格式处理
  9. python入门教程收藏_python入门教程:超详细保你1小时学会Python,快来收藏看看...
  10. matlab如何模拟竹蜻蜓飞行,JSBSim_Matlab 将 与 进行联合仿真 模拟飞行计算 247万源代码下载- www.pudn.com...