1 solutions
-
0
C++ :
#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(){ 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; }
- 1
Information
- ID
- 671
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- (None)
- # Submissions
- 0
- Accepted
- 0
- Uploaded By