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;
}
时间: 2024-12-29 01:24:20

codevs 1027 姓名与ID的相关文章

姓名与ID(codevs 1027 未结题)

题目描述 Description 有N个人,各自有一个姓名和ID(别名).每个人的姓名和ID都没有重复.这些人依次进入一间房间,然后可能会离开.过程中可以得到一些信息,告知在房间里的某个人的ID.你的任务是准确地确定每个人的ID. 输入描述 Input Description 第一行是整数N,表示N个人,N<=20. 接下来的一行是N个人的ID,用一个空格分隔. 接下来的若干行是过程的记录:一个字母和一个字符串.字母是E.L或M中的一个.E表示进入房间,后面跟的字符串表示进来的人的姓名:L表示离

[codevs1027]姓名与ID

试题描述 有N个人,各自有一个姓名和ID(别名).每个人的姓名和ID都没有重复.这些人依次进入一间房间,然后可能会离开.过程中可以得到一些信息,告知在房间里的某个人的ID.你的任务是准确地确定每个人的ID. 输入 第一行是整数N,表示N个人,N<=20. 接下来的一行是N个人的ID,用一个空格分隔. 接下来的若干行是过程的记录:一个字母和一个字符串.字母是E.L或M中的一个.E表示进入房间,后面跟的字符串表示进来的人的姓名:L表示离开房间,后面跟的字符串表示离开的人的姓名:M表示回答询问,后面跟

T2 选ID trie树

T2 选ID Description ? 机房似乎有许多人没有 ID,热心同志小 A 为了服务人民,所有决定帮大家找一个合适的 ID. ? 小 A 觉得一个合适的 ID,和这个人的相关程度应该是比较高的,就像他的 ID 里有他的名字缩写一样.为了量化这个相关程度,他定义一个人的名字 \(S\) 和他的 ID \(T\) 的匹配值的大小为\(lcp\)(\(S\),\(T\))?.现在有 \(n\) 个人,小 A 想好了 \(n\) 个 ID,他想知道如果把 ID 分配给机房众人,最后能够得到的最

winform导入导出excel,后台动态添加控件

思路: 导入: 1,初始化一个OpenFileDialog类 (OpenFileDialog fileDialog = new OpenFileDialog();) 2, 获取用户选择文件的后缀名(string extension = Path.GetExtension(fileDialog.FileName).ToLower();),并设置允许后缀文件名: 3,NPOI转datetable,遍历tatetable转成实体类列表并入库: 导出: 1, 创建提示用户保存类,SaveFileDial

转载---编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议47~51)

阅读目录 建议47:在equals中使用getClass进行类型判断 建议48:覆写equals方法必须覆写hashCode方法 建议49:推荐覆写toString方法 建议50:使用package-info类为包服务 建议51:不要主动进行垃圾回收 回到顶部 建议47:在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题,这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JavaBean中继承也很多见,代码如下: 1 p

前端之HTML

HTML解释: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器根据标记语言的规则去解释它. 浏览器负责将标签翻译成用户"看得懂"的格式,呈现给用户! 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览器如何

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

认识DOM(上)

认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title

小组作业 5月9号

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" andro