zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Zero-Copy&sendfile浅析
    Redis数据清除问题
    Redis官方文档》持久化
    GNU C 、ANSI C、标准C、标准c++区别和联系
    有关jQuery valid 验证多个同name属性的input的问题
    jQuery validator 增加多个模板
    archiver error. Connect internal only, until freed. 之解决办法
    链接ftp,把文件或图片上传到ftp指定的文件夹中
    java 数字金额转换中文金额
    java工具类 --千分位方法
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5648213.html
Copyright © 2011-2022 走看看