记录编号 19903 评测结果 AAAAAAAAAA
题目名称 罪犯问题D 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.714 s
提交时间 2010-10-19 10:40:17 内存使用 0.60 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;

const int MAXN=50005;

struct Node
{
	int v,w;
	Node *next;
	Node(int a,int b,Node *c):v(a),w(b),next(c){}
};

short int sta[MAXN];
int N,M;
Node *adj[MAXN];

queue<int> q;

void spfa()
{
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(Node *p=adj[u];p;p=p->next)
		if (sta[p->v]==-1)
		{
			sta[p->v]=sta[u]^p->w;
			q.push(p->v);
		}
	}
}	

inline void add(int a,int b)
{
	adj[a]=new Node(abs(b),b>0,adj[a]);
	if (sta[a]!=-1) q.push(a);
	adj[abs(b)]=new Node(a,b>0,adj[abs(b)]);
	if (sta[abs(b)]!=-1) q.push(abs(b));
	spfa();
}

int main()
{
	freopen("criminald.in","r",stdin);
	freopen("criminald.out","w",stdout);
	scanf("%d%d",&N,&M);
	memset(sta,-1,sizeof(sta));
	for(int i=0;i<M;i++)
	{
		int T;
		scanf("%d",&T);
		sta[T]=1;
		q.push(T);
	}
	spfa();
	while(true)
	{
		char ch;
		int t1,t2;
		do ch=getchar();
		while(ch!='A'&&ch!='S'&&ch!='E');
		if (ch=='E')
			break;
		if (ch=='A')
		{
			scanf("%d",&t1);
			switch (sta[t1])
			{
				case -1:printf("Unknown\n");break;
				case 1:printf("Yes\n");break;
				case 0:printf("No\n");break;
				default:cerr<<"wrong!\n";
			}
		}
		else if (ch=='S')
		{
			scanf("%d%d",&t1,&t2);
			add(t1,t2);
		}
	}
	return 0;
}