信与信封问题
2016-06-22 14:58
260 查看
题目大意
John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出。但是,第二天John的儿子Small
John将这n封信都拿出了信封。不幸的是,Small John无法将拿出的信正确地装回信封中了。
将Small John所提供的n封信依次编号为1,2,…,n;且n个信封也依次编号为1,2,…,n。假定Small
John能提供一组信息:第i封信肯定不是装在信封j中。请编程帮助Small John,尽可能多地将信正确地装回信封。
题解
首先找出最大匹配,如果最大匹配没有N个,那么就输出none。我们知道,如果一个信和信封是唯一对应的,那么删去这条边,将不存在完美匹配。所以我们对于每个信封,删去它与信封对应的边,看是否有完美匹配,如果没有就输出。注意最后要将边加上。
代码
function find(p:longint):longint;
var
t,q:longint;
begin
find:=true;
t:=ls[p];
while t>0 do
with g[t] do
begin
if v[y]=0 then
begin
v[y]:=1;
q:=link[y];
link[y]:=p;
if (q=0) or find(q) then exit;
link[y]:=q;
end;
t:=next;
end;
find:=false;
end;
procedure match;
var
i,ans:longint;
begin
fillchar(link,sizeof(link),0);
for i:=1 to n do
begin
fillchar(v,sizeof(v),0);
if find(i)then ans:=ans+1;
end;
writeln(ans);
end;
John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出。但是,第二天John的儿子Small
John将这n封信都拿出了信封。不幸的是,Small John无法将拿出的信正确地装回信封中了。
将Small John所提供的n封信依次编号为1,2,…,n;且n个信封也依次编号为1,2,…,n。假定Small
John能提供一组信息:第i封信肯定不是装在信封j中。请编程帮助Small John,尽可能多地将信正确地装回信封。
题解
首先找出最大匹配,如果最大匹配没有N个,那么就输出none。我们知道,如果一个信和信封是唯一对应的,那么删去这条边,将不存在完美匹配。所以我们对于每个信封,删去它与信封对应的边,看是否有完美匹配,如果没有就输出。注意最后要将边加上。
代码
function find(p:longint):longint;
var
t,q:longint;
begin
find:=true;
t:=ls[p];
while t>0 do
with g[t] do
begin
if v[y]=0 then
begin
v[y]:=1;
q:=link[y];
link[y]:=p;
if (q=0) or find(q) then exit;
link[y]:=q;
end;
t:=next;
end;
find:=false;
end;
procedure match;
var
i,ans:longint;
begin
fillchar(link,sizeof(link),0);
for i:=1 to n do
begin
fillchar(v,sizeof(v),0);
if find(i)then ans:=ans+1;
end;
writeln(ans);
end;
相关文章推荐
- JS一般般的网页重构可以使用Node.js做些什么(转)
- 对抗告警疲劳的8种方法
- 86. Partition List
- 数据结构之【队列】--复习
- 在Spring3中使用注解(@Scheduled)创建计划任务(最简化配置)
- WiFi万能钥匙蹭网原理详细剖析
- 2.3、Android Studio使用Layout Editor设计UI
- 94.Build Setting 之 Code Signing 详解
- 2.3、Android Studio使用Layout Editor设计UI
- 大型系统日志集成
- 剑指offer——二叉搜索树的第k个结点
- 利用lucene_4.3索引搜索demo
- 对抗告警疲劳的8种方法
- 闭包 尾随闭包
- OpenCV2.4.13+VS2013开发环境配置
- epoll之二:epoll实战
- 第一次打字测试成绩
- 闭包 尾随闭包
- 更改yum网易 阿里云的yum源。
- Webstorm2016激活码[ 转]