What's In A Name?
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 2600   Accepted: 933

Description

The FBI is conducting a surveillance of a known criminal hideout which serves as a communication center for a number of men and women of nefarious intent. Using sophisticated decryption software and good old fashion wiretaps, they are able to decode any e-mail messages leaving the site. However, before any arrest warrants can be served, they must match actual names with the user ID's on the messages. While these criminals are evil, they're not stupid, so they use random strings of letters for
their ID's (no dillingerj ID's found here). The FBI knows that each
criminal uses only one ID. The only other information they have which
will help them is a log of names of the people who enter and leave the
hideout. In many cases, this is enough to link the names to the ID's.

Input

Input
consists of one problem instance. The first line contains a single
positive integer n indicating the number of criminals using the hideout.
The maximum value for n will be 20. The next line contains the n user
ID's, separated by single spaces. Next will be the log entries in
chronological order. Each entry in the log has the form type arg , where
type is either E, L or M: E indicates that criminal arg has entered the
hideout; L indicates criminal arg has left the hideout; M indicates a
message was intercepted from user ID arg. A line containing only the
letter Q indicates the end of the log. Note that not all user ID's may
be present in the log but each criminal name will be guaranteed to be in
the log at least once. At the start of the log, the hideout is presumed
to be empty. All names and user ID's consist of only lowercase letters
and have length at most 20. Note: The line containing only the user ID's
may contain more than 80 characters.

Output

Output
consists of n lines, each containing a list of criminal names and their
corresponding user ID's, if known. The list should be sorted in
alphabetical order by the criminal names. Each line has the form
name:userid , where name is the criminal's name and userid is either
their user ID or the string ??? if their user ID could not be determined
from the surveillance log.

Sample Input

7
bigman mangler sinbad fatman bigcheese frenchie capodicapo
E mugsy
E knuckles
M bigman
M mangler
L mugsy
E clyde
E bonnie
M bigman
M fatman
M frenchie
L clyde
M fatman
E ugati
M sinbad
E moriarty
E booth
Q

Sample Output

bonnie:fatman
booth:???
clyde:frenchie
knuckles:bigman
moriarty:???
mugsy:mangler
ugati:sinbad
【题意】一个犯罪团伙有N个人,他们分别有一个名字和一个网名 现已知他们会先后进出一个房间发送电报 警方可以知道所有时间下: 进出房间的人的真实名字 同时通过截获该房间发出的电报,获得网名 问最后
能否将所有真实名字和虚拟网名对上
【分析】首先根据题目条件名字和网名是一一对应的,可以大概确定是二分匹配中的完美匹配 然而根据样例很容易看出来,要想根据正确关系来建边是很复杂的 容易的做法是:每次将不可能匹配的名字和网名建边,
最后根据补图进行最大匹配即可初步得出所有匹配关系.但现在得到的最大匹配不一定是完美匹配 要确定某个名字和网名是匹配的 我们可以删除当前已匹配的边,再进行最大匹配 如果结果减小了,则一定是对应的
这样,依次枚举每一条最大匹配中的边.即可得出答案
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <queue>
#include <vector>
#define inf 0x7fffffff
#define met(a,b) memset(a,b,sizeof a)
typedef long long ll;
using namespace std;
const int N = ;
const int M = ;
int read() {
int x=,f=;
char c=getchar();
while(c<''||c>'') {
if(c=='-')f=-;
c=getchar();
}
while(c>=''&&c<='') {
x=x*+c-'';
c=getchar();
}
return x*f;
}
struct man {
string a,b;
} s[N];
map<string,int>m1,m2;
string s1[N];
int edg[N][N];
int link[N],vis[N];
int mark[N];
int id,n; void init() {
memset(edg,,sizeof(edg));
memset(mark,,sizeof(mark));
id=;
m1.clear(),m2.clear();
} bool cmp(man x,man y) {
return x.a<y.a;
} bool dfs(int u) {
for(int i=; i<=n; i++) {
if(!vis[i]&&edg[u][i]==) {
vis[i]=;
if(link[i]==-||dfs(link[i])) {
link[i]=u;
return true;
}
}
}
return false;
} int MaxMatch() {
memset(link,-,sizeof(link));
int ans=;
for(int i=; i<=n; i++) {
memset(vis,,sizeof(vis));
if(dfs(i))
ans++;
}
return ans;
}
int main() {
int m,a,b,d;
char ch;
string str;
while(~scanf("%d",&n)) {
init();
for(int i=; i<=n; i++) {
cin>>s1[i];
m1[s1[i]]=i;
}
while(cin>>ch) {
if(ch=='Q')
break;
else {
cin>>str;
if(ch=='E') {
if(!m2[str])m2[str]=id++;
d=m2[str];
mark[d]=;
s[d].a=str;
s[d].b="???";
} else if(ch=='L') {
d=m2[str];
mark[d]=;
} else if(ch=='M') {
d=m1[str];
for(int i=; i<=n; i++)if(!mark[i])edg[d][i]=; //建立反向边
}
}
}
int ans=MaxMatch();
int linkt[N];
for(int i=; i<=n; i++) //原最大匹配中的边
linkt[i]=link[i];
for(int i=; i<=n; i++) {
d=linkt[i];
edg[d][i]=;
if(MaxMatch()!=ans)s[i].b=s1[d]; //最大匹配减少
edg[d][i]=;
}
sort(s+,s++n,cmp);
for(int i=; i<=n; i++)
cout<<s[i].a<<":"<<s[i].b<<endl;
}
return ;
}

POJ 1043 What's In A Name?(唯一的最大匹配方法)的更多相关文章

  1. 关于全局唯一ID生成方法

    引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  2. 转:C#生成唯一值的方法汇总

    这篇文章主要介绍了C#生成唯一值的方法汇总,有需要的朋友可以参考一下 生成唯一值的方法很多,下面就不同环境下生成的唯一标识方法一一介绍,作为工作中的一次总结,有兴趣的可以自行测试: 一.在 .NET ...

  3. C#生成唯一值的方法汇总

    生成唯一值的方法很多,下面就不同环境下生成的唯一标识方法一一介绍,作为工作中的一次总结,有兴趣的可以自行测试: https://www.cnblogs.com/xinweichen/p/4287640 ...

  4. POJ 1845-Sumdiv(快速幂取模+整数唯一分解定理+约数和公式+同余模公式)

    Sumdiv Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  5. 生成GUID唯一值的方法汇总(dotnet/javascript/sqlserver)

    一.在 .NET 中生成1.直接用.NET Framework 提供的 Guid() 函数,此种方法使用非常广泛.GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的任何两台计 ...

  6. oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法

    最近使用oraclede impdp工具全库导入数据库时,在数据库里面使用出现如下情况. SQL state : 违反唯一约束条件 (GDXAORCL.SYS_C0055359) ; nested e ...

  7. STM32全球唯一ID读取方法

    产品唯一的身份标识非常适合:● 用来作为序列号(例如USB字符序列号或者其他的终端应用)● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性.● 用来激 ...

  8. poj 3311 floyd+dfs或状态压缩dp 两种方法

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6436   Accepted: 3470 ...

  9. 【霍夫曼树】poj 1339 poker card game (数组排序+辅助队列的方法,预处理O(nlogn),构造霍夫曼树O(n))

    poj.org/problem?id=1339 #include<iostream> #include<cstdio> #include<string> #incl ...

随机推荐

  1. PowerShell工具脚本---按行数切割大文本文件

    我编写的PowerShell工具脚本,[按行数切割大(文本)文件],生成n个小文件. 主要目的是为了能够让excel快速处理.或用脚本并发处理文本. 注意: 1 如果有必要,你可以先用其他工具,把大文 ...

  2. 通过获取DNS解析的未转义主机名,区分测试环境和正式环境代码

    ASP.Net编程中经常有一些代码,测试环境下需要执行,而正式环境下不需要执行(或者反之). 我们经常做的方式是:去掉注释,测试,再注释,再编译上传(或者反之). 现在,不妨试试以下办法: Reque ...

  3. sqlserver定时备份

    前言:给客户部署好系统以后,如果不加一个定时备份,总感觉心里不放心,所以一定要做定时备份,并且定时备份是很简单的 新建作业--基本信息 新建步骤 ) ),) print @filename , NOF ...

  4. TCP同步传送数据示例(简洁、清楚)

    转自:http://www.2cto.com/kf/201206/134841.html 本例子写了个简单的TCP数据传送功能.没有使用BinaryWriter,BinaryReader,而是使用Ne ...

  5. 华为V-ISA信誉安全体系:对付新型DDoS攻击的利器

        华为Anti-DDoS解决方案基于华为颇具传统优势的专业软硬件平台开发,在防护机制中,引入先进的检测机制,提供了业内首创的“V-ISA”信誉安全体系,是业界唯一单机可提供超百G DDoS防御能 ...

  6. RTL2832U+R820电视棒跟踪飞机轨迹教程(ADS-B)

    Ubuntu 14.04.3 amd64 apt-get install git apt--dev 安装rtl-sdr git clone git://git.osmocom.org/rtl-sdr. ...

  7. php生成图片注释

    //生成验证码图片注释 <?php session_start(); $arr = array( 'a','b','c','d','e','f','g','h','i','j','k','l', ...

  8. Python入门(二,基础)

    一,基本语法 Python标识符 在python里,标识符有字母.数字.下划线组成. 在python中,所有标识符可以包括英文.数字以及下划线(_),但不能以数字开头. python中的标识符是区分大 ...

  9. HTML中的鼠标光标属性

    在网页中默认的鼠标指针只有两种,一种是最普通的箭头,另一种是当移动到链接上时出现的“小手”.但现在越来越多的网页都使用了CSS鼠标指针技术,当将鼠标移动到链接上时,可以看到多种不同的效果.CSS可以通 ...

  10. VBS_For_next

    指定循环次数,使用计数器重复运行语句,语法结构如下: 1 2 3 4 5 For counter = start To end [Step step]     [statements]     [Ex ...