比赛 2011.3.17 评测结果 AAAAAAAAAA
题目名称 奶牛议会 最终得分 100
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-03-17 10:52:34
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN=5000;

struct Node
{
	int v;
	Node *next;
	Node (int _v,Node *_next):
		v(_v),next(_next){}
}*adj[MAXN][2];

inline void addedge(int u1,int u2,int v)
{
	adj[u1][u2]=new Node(v,adj[u1][u2]);
}

int sta[MAXN],cow[MAXN];
int N,M;
int a[MAXN],b[MAXN];
bool va[MAXN],vb[MAXN];

bool bfs(int s)
{
	queue<pair<int,int> >q;
	q.push(make_pair(s,sta[s]));
	memset(cow,0,sizeof(cow));
	while(q.size())
	{
		pair<int,int> u=q.front();
		q.pop();
		for(Node *p=adj[u.first][u.second];p;p=p->next)
			cow[p->v]=1;
		for(Node *p=adj[u.first][(u.second^1)];p;p=p->next)
			if (cow[p->v]!=1)
			{
				int nu1=0,nu2=0;
				int i=p->v;
				if (a[i]==u.first && va[i]==(u.second^1))
				{
					nu1=b[i];nu2=vb[i];
				}
				else if (b[i]==u.first && vb[i]==(u.second^1))
				{
					nu1=a[i];nu2=va[i];
				}
				if (sta[nu1]==(nu2^1))
					return false;
				else
				{
					if (sta[nu1]==-1)
					{
						sta[nu1]=nu2;
						q.push(make_pair(nu1,nu2));
					}
					cow[p->v]=1;
				}

			}
	}
	return true;
}

int can[MAXN];
int main()
{
	freopen("cowngress.in","r",stdin);
	freopen("cowngress.out","w",stdout);
	scanf("%d%d",&N,&M);
	for(int i=1;i<=M;i++)
	{
		char cva,cvb;
		scanf("%d",a+i);
		scanf(" %c",&cva);
		scanf("%d",b+i);
		scanf(" %c",&cvb);
		va[i]=(cva=='Y');
		vb[i]=(cvb=='Y');
		addedge(a[i],va[i],i);
		addedge(b[i],vb[i],i);
	}
	memset(sta,-1,sizeof(sta));
	for(int i=1;i<=N;i++)
	{
		memset(sta,-1,sizeof(sta));
		sta[i]=0;
		if (bfs(i))
			can[i]+=1;
		memset(sta,-1,sizeof(sta));
		sta[i]=1;
		if (bfs(i))
			can[i]+=2;
		if (can[i]==0)
		{
			printf("IMPOSSIBLE\n");
			return 0;
		}
	}
	for(int i=1;i<=N;i++)
	{
		switch(can[i])
		{
			case 1:printf("N");break;
			case 2:printf("Y");break;
			case 3:printf("?");break;
			default:return -1;
		}
	}
	printf("\n");
	return 0;
}