Poj-2912 Rochambeau 枚舉+並查集

題目鏈接

題意

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章