http://acm.pku.edu.cn/JudgeOnline/problem?id=1043
Код:
#include <iostream> #include <algorithm> #include <string.h> using namespace std; struct criminal { char name[21]; int id; }c[20]; int n, m; char id[20][21], op, str[21]; bool in[20], g[20][20]; int cmp(void const* a, void const* b) { return strcmp(((criminal *)a)->name, ((criminal *)b)->name); } int Bipartite(bool vc[][20], int nv1, int nv2); int main() { int i, j; cin>>n; for (i=0; i<n; i++) cin>>id[i]; m=0; cin>>op; std::fill(g[0], g[0]+20*n, true); std::fill(in, in+n, false); while(op!='Q') { cin>>str; if (op=='E') { for (i=0; i<m&&strcmp(c[i].name, str); i++); if (i==m) { strcpy(c[i].name, str); c[i].id=-1; m++; } in[i]=true; } else if (op=='L') { for (i=0; i<m&&strcmp(c[i].name, str); i++); in[i]=false; } else { for (i=0; i<n&&strcmp(id[i], str); i++); for (j=0; j<n; j++) { if (!in[j]) g[i][j]=false; } } cin>>op; } for (i=0; i<m; i++) { c[i].id=-1; for (j=0; j<n&&c[i].id==-1; j++) { if (g[j][i]) { g[j][i]=false; if (Bipartite(g, n, m)<m) c[i].id=j; g[j][i]=true; } } } qsort(c, m, sizeof(criminal), cmp); for (i=0; i<n; i++) { cout<<c[i].name<<":"; if (c[i].id==-1) cout<<"???"; else cout<<id[c[i].id]; cout<<endl; } } int Bipartite(bool vc[][20], int nv1, int nv2) { int i, j, x, n; int q[20], prev[20], qs, qe; int vm1[20], vm2[20]; n=0; for (i=0; i<nv1; i++) vm1[i]=-1; for (i=0; i<nv2; i++) vm2[i]=-1; for (i=0; i<nv1; i++) { for (j=0; j<nv2; j++) prev[j]=-2; qs=qe=0; for (j=0; j<nv2; j++) if (vc[i][j]) { prev[j]=-1; q[qe++]=j; } while (qs<qe) { x=q[qs]; if (vm2[x]==-1) break; qs++; for (j=0; j<nv2; j++) if(prev[j]==-2&&vc[vm2[x]][j]) { prev[j]=x; q[qe++]=j; } } if (qs==qe) continue; while (prev[x]>-1) { vm1[vm2[prev[x]]]=x; vm2[x]=vm2[prev[x]]; x=prev[x]; } vm2[x]=i; vm1[i]=x; n++; } return n; }