poj2912 Rochambeau---枚举+并查集
题目链接:https://vjudge.net/problem/POJ-2912
注意到n,m都很小,所以可以枚举每一个人,判断他能否为裁判(如果不考虑这个人参与的胜负关系,其他的胜负关系没有矛盾,则他可能为裁判)。判断是否矛盾可以用并查集,这个过程和poj1182基本一样。最后的问题是判断最早在第几行可以确定,如果确定只有一个人是裁判,那么其他人必然都不是,所以其他n-1个人出现矛盾的最大行数就是答案
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct st{int x,y; char ch;}r[2010];
int v[510],fa[510],n,m,i,k;
int find(int x){
if (fa[x]!=x){
int t=fa[x];
fa[x]=find(fa[x]);
v[x]=(v[x]+v[t])%3;
}
return fa[x];
}
int main(){
while (~scanf("%d%d",&n,&m)){
for (i=1;i<=m;i++) scanf("%d%c%d",&r[i].x,&r[i].ch,&r[i].y);
int num,step,f,p; num=step=0;
for (k=0;k<n;k++){
for (i=0;i<n;i++) fa[i]=i;
memset(v,0,sizeof(v)); f=0;
int d1,d2;
for (i=1;i<=m;i++){
if (r[i].x==k||r[i].y==k) continue;
if (r[i].ch=='=') d1=0;
else if (r[i].ch=='<') d1=1; else d1=2;
int fx=find(r[i].x); int fy=find(r[i].y);
if (fx==fy){
d2=(v[r[i].x]-v[r[i].y]+3)%3;
if (d1!=d2){ f=1; step=max(i,step); break;}
}
else {
fa[fx]=fy; v[fx]=(v[r[i].y]+d1-v[r[i].x]+3)%3;
}
}
if (f==0) { p=k;num++;}
}
if (num>1) printf("Can not determine\n");
else if (num==0) printf("Impossible\n");
else printf("Player %d can be determined to be the judge after %d lines\n",p,step);
}
return 0;
}

浙公网安备 33010602011771号