Rochambeau POJ - 2912

N只有500枚举聪明人,用权值并查集维护

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

#define MAX_N 50010

#define sci(num) scanf("%d",&num)
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
#define  MOD 3
int fa[MAX_N], r[MAX_N];
int pos[MAX_N];
bool judge[MAX_N];
int N, M, x, y;

   
   
    
    char
   
    ch;
struct Flag {
    int x,y,f;
} fs[2010];
int Find(int x) {
    if (fa[x] != x) {
        int p = fa[x];
        fa[x] = Find(fa[x]);
        r[x] = (r[x] + r[p]) % MOD;
    }
    return fa[x];
}
void init() {
    for (int i = 0;i <= N;i++) {
        fa[i] = i;
        r[i] = 0;
    }
}
int main() {
    while (~scanf("%d%d",&N,&M) ){
        for (int i = 0;i < M;i++) {
            scanf("%d%c%d",&fs[i].x,&ch,&fs[i].y);
            if (ch == '<') fs[i].f = 2;
            else if (ch == '=') fs[i].f = 0;
            else if (ch == '>') fs[i].f = 1;
        }

        mem(judge,0); mem(pos,0);
        for (int i = 0;i < N ;i++) {
            init();
            for (int j = 0;j < M;j++) {
                if (fs[j].x == i || fs[j].y == i) continue;
                int fx = Find(fs[j].x); int fy = Find(fs[j].y);
                if (fx == fy) {
                    int rxy = (r[fs[j].x] - r[fs[j].y] + MOD) % MOD;
                    if (rxy != fs[j].f) {
                       judge[i] = true;
                       pos[i] = j + 1;
                       break;
                    }
                } else {
                    int rxfy = (fs[j].f + r[fs[j].y]) % MOD;
                    int rfxfy = (r[fs[j].x] - rxfy + MOD) % MOD;
                    r[fy] = rfxfy;
                    fa[fy] = fx;

                }
            }
        }
        int mpos = 0;
        int wp = -1;
        int cnt=  0;
        for (int i = 0;i < N;i++) {
            if (!judge[i]) {
                cnt++;
                wp = i;
            } else {
                mpos = max(mpos,pos[i]);
            }
        }
        if(cnt==0)
            printf("Impossible\n");
        else if(cnt==1)
            printf("Player %d can be determined to be the judge after %d lines\n",wp,mpos);
        else if(cnt>1)
            printf("Can not determine\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值