POJ 2912 Rochambeau(并查集)

原创 2018年04月17日 08:32:41

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

题目意思

一群人玩石头,剪刀,布;把这群人分成3组,分别只能出石头,剪刀,布。但是其中有个是裁判可以任意出。现在给你m组两两对决的结果,问是否能找到裁判,如果能输出裁判序号和在第几个对决结果出来时找到的。不能输出对应字符串。

解题思路

这题是在poj1182食物链上加个裁判形成的。所以只要遍历去除某一点有关的边。如果形成的集合不冲突,那么这个点就有可能是裁判。当可能个数为1时就能找到裁判。同时在冲突点中找到需要步数最多才冲突的那个点的步数。如果不等于1输出对应字符串。

代码部分


#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <string>
#include <map>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3
const int N = 1005;
int pre[N];  ///记录集合序号 
int val[N]; ///权值 
int n,m,ans;
bool fa;
int Max;  ///最大错误步数 
struct node 
{
    int x,y,k;
}a[N*2];
void init() ///初始化 
{
    for (int i = 0; i < n; i++)
    {
        pre[i] = i;
        val[i] = 0;
    } 
    ans = 0 ;       
    fa = true;
}
int fin(int x)
{
    int k = pre[x];
    if (x != pre[x])
    {
        pre[x] = fin(pre[x]);
        val[x] = (val[x]+val[k])%3;  
    }   
    return pre[x];
}
void join(int x,int y,int k)
{
    int fx = fin(x);
    int fy = fin(y);
    if (fy == fx && (val[x]+k)%3 != val[y])  ///不满足 
        fa = false;
    else 
    {
        pre[fy] = fx;
        val[fy] = (val[x]-val[y]+k+3)%3;  ///权值更新 
    }
}
int main()
{
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        int x,y,k,t=0;
        Max = 0;
        char c;
        for (int i = 0; i < m; i++)
        {
            scanf("%d%c%d",&a[i].x,&c,&a[i].y);
            if (c == '=')
                a[i].k = 0;
            else if (c == '>')
                a[i].k = 1;
            else a[i].k = 2;
        }
        for (int i = 0; i < n; i++)  ///遍历每个人 
        {
            init();
            for (int j = 0; j < m;j++)
            {
                if (fa)  ///计算错误在第几步 
                    ans++;
                if (a[j].x == i || a[j].y == i)  ///排除带i的边 
                    continue;
                join(a[j].x,a[j].y,a[j].k);
            }
            if (fa) 
            {
                t++;  ///判断可以为裁判的个数 
                k = i;
            }   
            else 
            {
                if (ans > Max)
                    Max = ans;
            }
        }
        if (t > 1)
            printf("Can not determine\n");
        else if (t == 0)
            printf("Impossible\n");
        else printf("Player %d can be determined to be the judge after %d lines\n",k,Max);
    }
    return 0;
}

版权声明:本文为博主原创文章,转载请附带博主链接。 https://blog.csdn.net/pashuihou/article/details/79969292

POJ - 2912 Rochambeau 种类并查集

题意:有三组小朋友在玩石头剪刀布,同一组的小朋友出的手势是一样的。这些小朋友中有一个是裁判,他可以随便出手势。现在给定一些小朋友的关系,问能否判断出裁判,如果能最早什么时候能够找到裁判。      ...
  • flyawayl
  • flyawayl
  • 2017-04-03 11:02:58
  • 364

POJ 2912 Rochambeau(枚举+并查集)

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove  题目:给出n个人玩剪刀石...
  • ACM_cxlove
  • ACM_cxlove
  • 2012-10-20 19:33:09
  • 2703

并查集-POJ2912 Rochambeau

题意:有n个孩子玩"石子剪刀布",有3组,每一组在每一轮游戏中的孩子出的手势是一样,但在他们其中有一个judge出的手势是随意。经过m次游戏,问你能否找出这个judge的孩子。 分析:此题是3个制约关...
  • show999hao
  • show999hao
  • 2013-10-27 21:07:51
  • 604

POJ - 2912 Rochambeau(带权并查集+暴力)

题目大意:给出N个人剪刀石头布的结果,问能否判断哪个人是裁判,在第几个回合可以判定解题思路:如果这个人是裁判的话,那么去掉它的话,对结果是不影响的 所以可以暴力枚举一下谁当裁判,然后判断一下#inc...
  • L123012013048
  • L123012013048
  • 2015-09-16 00:28:49
  • 314

poj 2912 - Rochambeau(并查集)

题意、思路:      跟poj1182食物链题意题意几乎是一样的,那个题目的意思是a吃b,b吃c,c吃a,而这个是剪子包袱锤,所以说是一样的。集合合并和路径压缩的公式是一样的。只需要把这个题的"a>...
  • shankeliupo
  • shankeliupo
  • 2013-10-24 22:48:49
  • 353

POJ 2912 Rochambeau(路径压缩并查集)

POJ 2912 Rochambeau(路径压缩并查集) 分析:由于题目N 现在我们假设了i是裁判,那么我们如何才能判断他到底是还是不是呢?首先对于输入的 a ?b: 如果a b 分别属于不同的分量,...
  • u013480600
  • u013480600
  • 2014-03-13 23:29:31
  • 986

POJ 2912 Rochambeau 并查集+枚举

和食物链那题很像,只要把裁判枚举一遍即可,当前枚举的裁判不参与矛盾判断,没有矛盾的组数为0时,即Inpossible,大于1时就是Can not determine,等于1时是可以确定裁判的,裁判即没...
  • PrimeG
  • PrimeG
  • 2017-04-28 17:30:06
  • 131

POJ ~ 2912 ~ Rochambeau (枚举+并查集)

题意:你在看N个小孩在玩石头剪刀布,编号为0 ~ n-1,每个小孩会一直出同一种手势(如果出石头就一直出石头),但是这些小孩中有一个法官,法官想出什么手势就出什么手势。他们总共玩了M局游戏(1~M),...
  • ZscDst
  • ZscDst
  • 2018-01-21 13:35:56
  • 136

poj 2912 Rochambeau(暴力+并查集)

题目链接:poj 2912 Rochambeau 题目大意:n个小伙伴进行猜拳有戏,除了一个比较聪明的家伙以外,其他人只会出单一的一种,给出m中猜拳的结果,要求找出那个比较聪明的小伙伴序...
  • u011328934
  • u011328934
  • 2014-04-17 14:11:03
  • 1062
收藏助手
不良信息举报
您举报文章:POJ 2912 Rochambeau(并查集)
举报原因:
原因补充:

(最多只允许输入30个字)