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;
}