codevs 1027 姓名与ID


/*
二分图匹配 建图稍麻烦点
不过 有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;
}

优质内容筛选与推荐>>
1、〖天涯头条〗原创成人漫画《小老爷们那点事儿》(连载)
2、PHP调用接口到阿里云OSS同步上传图片
3、隐藏和显示div的两种方法
4、网页禁止右键、禁止查看源代码、禁止复制和另存
5、JS动态获取项目名以及获取URL地址中的参数


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号