标签:
/* 二分图匹配 建图稍麻烦点 不过 有STL大法带我上天 说正经的 先假设都有关系 然后把确定的没有关系的删掉 这样跑出来的一定是完美匹配 至于确定的匹配嘛 删掉这一条 不再是完美匹配 然后记下排序输出 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #define maxn 25 using namespace std; int n,sum,k,g[maxn][maxn],ans,match[maxn],use[maxn]; bool vis[maxn]; string s,q[maxn],id[maxn]; char si; map<string,int>p,f,us; struct node { int name,ID; }a[maxn]; int cmp(node x,node y) { return q[x.name]<q[y.name]; } bool Dfs(int s) { for(int i=1;i<=n;i++) if(vis[i]==0&&g[s][i]) { vis[i]=1; if(match[i]==0||Dfs(match[i])) { match[i]=s; return 1; } } return 0; } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>s;p[s]=i;id[i]=s; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=1; while(1) { cin>>si; if(si==‘Q‘)break; cin>>s; if(si==‘E‘) { if(us[s]==0)q[++k]=s; f[s]=1;us[s]=1; } if(si==‘L‘)f[s]=0; if(si==‘M‘) { for(int i=1;i<=n;i++) if(f[q[i]]==0) g[i][p[s]]=0; } } for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); ans+=Dfs(i); } int Tar=ans; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(!g[i][j])continue; g[i][j]=0;ans=0; memset(match,0,sizeof(match)); for(int o=1;o<=n;o++) { memset(vis,0,sizeof(vis)); ans+=Dfs(o); } if(ans<Tar) { a[++sum].name=i; a[sum].ID=j; use[i]=1; } g[i][j]=1; } for(int i=1;i<=n;i++) if(use[i]==0)a[++sum].name=i; sort(a+1,a+1+sum,cmp); for(int i=1;i<=sum;i++) if(use[a[i].name])cout<<q[a[i].name]<<":"<<id[a[i].ID]<<endl; else cout<<q[a[i].name]<<":???"<<endl; return 0; }
标签:
原文地址:http://www.cnblogs.com/yanlifneg/p/5648213.html