记录编号 |
181251 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
二分图游戏 |
最终得分 |
100 |
用户昵称 |
stdafx.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;
}