记录编号 181251 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 二分图游戏 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 0.827 s
提交时间 2015-08-23 17:53:29 内存使用 1.01 MiB
显示代码纯文本
#define MAXN 1001UL
#define MAXE 100001UL

#include <cstdio>
#include <cstring>

struct Edge{
	int v,nx;
};

Edge edge[MAXE];

int ec,n,a,b,n1,n2,m,headlist[MAXN],link[MAXN];

bool used[MAXN];

inline void Match(int c,int d){
	link[c]=d;link[d]=c;
	return;
}

inline void Add_Edge(int u,int v){
	edge[++ec].v=v;
	edge[ec].nx=headlist[u];
	headlist[u]=ec;
	return;
}

bool dfs(int p){
	used[p]=1;
	for(int i=headlist[p];i;i=edge[i].nx){
		if(!used[edge[i].v]){
			used[edge[i].v]=1;
			if((!link[edge[i].v])||dfs(link[edge[i].v])){
				link[link[p]]=0;Match(p,edge[i].v);
				return true;
			}
		}
	}
	return false;
}

inline void Print(int p,int r){
	if(!r){
		putchar('N');
	}
	else{
		putchar('P');
	}
	if(p==n1){
		puts("");
	}
	return;
}

inline int in(){
	int x=0,c=getchar();
	while(c<'0'||c>'9'){
		c=getchar();
	}
	for(;c>='0'&&c<='9';c=getchar()){
		x=(x<<1)+(x<<3)+c-48;
	}
	return x;
}

int main(){
	freopen("graphgame.in","r",stdin);
	freopen("graphgame.out","w",stdout);	
	n1=in();n2=in();m=in();
	for(int i=1;i<=m;i++){
		a=in();b=in();
		Add_Edge(a,b+n1);Add_Edge(b+n1,a);
	}
	n=n1+n2;
	for(int i=1;i<=n1;i++){
		memset(used,0,sizeof(used));dfs(i);
	}
	for(int i=1;i<=n;i++){
		int stats=0;
		if(!link[i]){
			stats=1;
		}
		else{
			memset(used,0,sizeof(used));
			int bp=link[i];link[bp]=0;link[i]=0;used[i]=1;
			if(dfs(bp)){
				stats=1;
			}
			else{
				Match(i,bp);
			}
		}
		Print(i,stats);
	}
	return 0;
}