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. Problem K 栈

    Description A math instructor is too lazy to grade a question in the exam papers in which students a ...

  2. SharePoint 2013 开发——发布SharePoint应用程序

    博客地址:http://blog.csdn.net/FoxDave 前几篇我们介绍了开发.部署和调试SharePoint应用程序的基础,本篇介绍更实用的操作,当我们开发一个SharePoint应用 ...

  3. windows azure中国 里面建立一个虚拟机,与虚拟机建立通信 里面部署IIS,外网访问

    在windows azure中国 里面建立一个虚拟机,里面部署IIS,外网不能访问么? 外网访问的地址是给的那个DNS地址 ,比如我的是 DNS 名称 urbanairserver.cloudapp. ...

  4. MongoDB 语法(转)

    Mongod.exe 是用来连接到mongo数据库服务器的,即服务器端. Mongo.exe 是用来启动MongoDB shell的,即客户端. 其他文件: mongodump 逻辑备份工具. mon ...

  5. poj1647

    转自:http://woodjohn.blog.sohu.com/231905679.html 题意是比较简单的:假定你是国际象棋中的白方,现在棋盘上只剩下白王.黑王和白后(王和后的走法规则就不赘述了 ...

  6. intent 传参数

    一.传递List<String>和List<Integer>以下以传递List<String>为例,发送List<String>语法为:intent.p ...

  7. hadoop环境搭建遇到问题集锦

    1  在hadoop的bin目录下, 运行hadoop version命令,提示“hadoop:没有此命令” 解决办法: ./hadoop version或者$HADOOP_HOME/bin放在PAT ...

  8. 解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义重复

    从图片中我们可以看到,这里在语义上有一定的重复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,不过由于Android4.3在锁屏功能上比起老版本做了很大的改动,而 ...

  9. php 安装composer

    右击我的电脑 再属性 再高级 再环境变量 再系统变量里有个path 双击打开来 把你的PHP路径 加个分号再前面 添加进去就OK了 1.http://www.th7.cn/Program/php/20 ...

  10. AngularJS基本指令

    <!doctype html> <html  ng-app> <head>   <meta charset="UTF-8">   & ...