題意
給出n種關係,有以下三種情況:
a>b :a贏了b
a<b :b贏了a
a=b :a與b平手
現在有三組人,出的手勢是一定的,但是其中有一名judge,他可以出任意手勢。問通過哪一行就可以推斷出誰是judge。若沒有則輸出impossible。若有多個,則輸出can not determine
分析
1.如何確定Judge
因爲Judge可以任意出手勢,所以凡是有關judge所建立起的關係都是不可靠的。
因此,我們可以枚舉judge,凡是跟judge有關的關係都不考慮。如果此時建立起的關係有矛盾,則說明現在枚舉到得人不是judge。
若有矛盾,則記錄下在哪句話矛盾。此時,這句話即爲判斷該人不是judge的一行。
能判斷出誰的裁判的那行即爲其他不是裁判點都在該行前出現衝突,故該行即爲上述出現衝突行的最大值。
若有若干個人枚舉後無矛盾,即這些人作爲judge時均無矛盾,則can not determine。
#include "stdio.h"
#include "map"
#include "queue"
#include "iostream"
#include "functional"
#include "math.h"
#include "algorithm"
using namespace std;
const int maxn = 2005;
const int mod = 1000000007 ;
const int inf = 1<<30;
typedef __int64 LL;
typedef pair<int,int> pii;
int n,m;
int p[maxn],r[maxn];
struct Node
{
int a,b,g;
}que[maxn];
int find( int x )
{
if( p[x] == x ) return x;
int tmp = p[x];
p[x] = find( p[x] );
r[x] = ( r[x] + r[tmp] )%3;
return p[x];
}
bool merge( int a,int b,int d )
{
int x = find( a );
int y = find( b );
if( x != y )
{
p[y] = x;
r[y] = ( r[a] + (3 - r[b]) + d-1 )%3;
return true;
}
return false;
}
void init()
{
for( int i = 0; i <= n; i ++ )
{
p[i] = i;
r[i] = 0;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("data.txt","r",stdin);
#endif
char ch;
while( scanf("%d%d",&n,&m) != EOF )
{
for( int i = 1; i <= m; i ++ )
{
scanf("%d%c%d",&que[i].a,&ch,&que[i].b);
if( ch == '=' ) que[i].g = 0;
else if( ch == '>' ) que[i].g = 2;
else if( ch == '<' ) que[i].g = 1;
}
int flag = 0,ok,line = 0,judge = 0;
for( int i = 0; i < n; i ++ )
{
init(); ok = 1;
for( int j = 1; j <= m; j ++ )
{
if( que[j].a != i && que[j].b != i ){
int fx = find( que[j].a );
int fy = find( que[j].b );
if( fx == fy )
{
if( ( r[que[j].a]+ que[j].g )%3 != r[que[j].b] )
{
ok = false;
line = max( line,j );
break;
}
}
else
{
p[fy] = fx;
r[fy] = ( r[fx] + r[que[j].a] + 3 - r[que[j].b] + que[j].g )%3;
}
}
}
if( ok ){
if( ++flag > 1 ) break;
judge = i;
}
}
if( flag == 1 )
printf("Player %d can be determined to be the judge after %d lines\n",judge,line);
else if( flag == 0 ) printf("Impossible\n");
else printf("Can not determine\n");
}
return 0;
}