最大流应用实验

最大流应用问题

实验概述

论文评审问题

  1. 有m篇论文和n个评审,每篇论文需要安排a个评审,每个评审最多评b篇论文。请设计一个论文分配方案。
  2. 要求应用最大流解决上述问题,画出m=10,n=3的流网络图并解释说明流网络图与论文评审问题的关系。
  3. 编程实现所设计算法,计算a和b取不同值情况下的分配方案,如果没有可行方案则输出无解。

实验思路

最大流建图

论文-评委是一个二分图,讨论的是二分图的连接问题。以流量的角度来看,我们向每篇论文发放一个容量为a的流量。而评委方每个评委可以承载的流量为b。最后,我们需要将论文方的流量全部发送到评委方。如果流量没有全部发送完毕,就是一个无解的情况。为了使用最大流的算法,可以在论文方添加一个源点,评委方添加一个汇点。
origin
源点可以看作是发送站,要将a流量发至每一个论文结点。然后论文结点需要想办法将流量发至评委结点,而每个论文结点和评委结点之间都有一条路,其容量为1,既代表评审一篇论文。专家结点要想办法将流量发送到汇点,因为那样才能完成一篇论文的评审。每个专家与汇点的通路的容量为b,既每个专家最多评审b篇论文。b用完后,该专家无法到达汇点(无法完成论文评审)。

最大流求可行解

我们知道最大流问题是求源点到汇点送出的流的最大值。在本问题中,要想把所有论文评审完毕,最大流就必须是m*a。
remain
最后找到所有从评委到论文的边,这些边都是原来论文到评委的反向边,代表经过了这些路径。

画出的反向边就是最后的连线

如果最后发现最大流 < m*a,就没有解,因为源点送出去的流量没有全部传到。本质上是有论文没有被审批。造成这种现象的原因是论文必须要a个评委,而评委有上限为b篇论文。在网络中,体现为评委向汇点的路径不能承受所有传递过来的流量。
final
标出的红色边是未送达的流量,说明无解

直接判断有无解的方法就是看是否am < bn && a < n。如果是就一定有解,既评委向汇点的路径必能承受所有传递来的流量。
no-sol

最大流算法

现在,问题基本上就解决了,我们可以使用最大流算法来求解了。最大流算法五花八门,大家可以自行百度。其中《算法导论》中的例子是Ford Fulkson (DFS),更好的是EK (Edmons-Karp)算法 (BFS),但不是最好。最好的算法是Dinic,一种BFS分层DFS方法,因为我们的二分图具有明显的层次感。我们老师的要求是比较EK和Dinic,当然最好是多实现几种最大流算法啦。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值