c语言最小费用流_网络流算法习题——建模案例

以下只考虑建模过程,建模后具体求解请见:

黄含驰:初中宝宝也能理解的网络流算法剖析,终于找到葵花宝典了,我太男啦!​zhuanlan.zhihu.com

1.POJ 2135

 题目描述:
 有n个景点,一个人要从1号景点走到n号景点,再 从n号景点走到1号(回来的路不能重复,不一定走 完所有景点,只要求从1到n即可),给你一些景点 之间的路的长度(双向),问你最短需要走多少路 才能回来?
 解题报告:
 最小费用就是路径长度的总和,最大流就是来回的 两条路。
 由于去和回来可以看成:2条从1到n的不同的路。 所以转化成求从1到n的两条不同的路。  假设a b之间有长度为c的路。按照最小费用流建 图:
 ab之间费用为c,容量是1。
 ba之间费用为c,容量是1.
 建立一个源点,连接1号景点,无费用,容量为2 (表示可以有两条路)
 同理,建立一个汇点,连接n号景点,无费用,容 量为2.
 这样,如果求的的最大流是2,就表示了有两条从 1到n的不同的路。(因为中间的点边容量只是1, 只能用一次)
 这样求的最小费用最大流的最小费用就是最短路 径长度。

2.POj 2396 Budget

参考: http://blog.csdn.net/wsniyufang/article/details/6601162 现在有一个n*m的方阵,方阵里面的数字未知,但是我们 知道如下约束条件:

1> 每一行的数字的和 2> 每一列的数字的和 3> 某些格子里的数,大小有限制。比如规定第2 行第3列的数字必须大于5(或必须小于3,或必须等于10 等)

求解是否存在在满足所有的约束的条件下用正数来填 充该方阵的方案,若有,输出填充后的方阵,否则输出 IMPOSSIBLE.

015308424528a040c363dd5caf2c7e43.png

本题trick:
1) W可能为负数,产生流量下界为负数的情况。应处理成 0
2) 数据本身可能矛盾。比如前面说了 (2,1) =1,后面又说 (2,1) = 10

3.POJ 3436 ACM Computer Factory

电脑公司生产电脑有N个机器,每个机器单位时间产量为 Qi。
电脑由P个部件组成,每个机器工作时只能把有某些部件 的半成品电脑(或什么都没有的空电脑)变成有另一些部件 的半成品电脑或完整电脑(也可能移除某些部件)。求电脑 公司的单位时间最大产量,以及哪些机器有协作关系,即 一台机器把它的产品交给哪些机器加工。

d1da9ee1d0f286a036df610bc109e13a.png

建模分析:

每个工厂有三个动作:
1)接收原材料
2)生产
3)将其产出的半成品给其他机器,或产出成品。
这三个过程都对应不同的流量。

网络流模型:
1) 添加一个原点S,S提供最初的原料 00000...
2) 添加一个汇点T, T接受最终的产品 11111....
3) 将每个机器拆成两个点: 编号为i的接收节点,和编号 为i+n的产出节点(n是机器数目),前者用于接收原料, 后者用于提供加工后的半成品或成品。这两个点之间要 连一条边,容量为单位时间产量Qi
4) S 连边到所有接收 "0000..." 或 "若干个0及若干个2" 的机器,容量为无穷大
5) 产出节点连边到能接受其产品的接收节点,容量无穷 大
6) 能产出成品的节点,连边到T,容量无穷大。
7) 求S到T的最大流

eae05005fb7a6f9c66ccf17f9afaaabe.png

4.poj 2112 Optimal Milking

有K台挤奶机器和C头牛(统称为物体),每台挤奶机器 只能容纳M头牛进行挤奶。现在给出dis[K + C][K + C] 的矩阵,dis[i][j]若不为0则表示第i个物体到第j个物体之 间有路,dis[i][j]就是该路的长度。(1 <= K <= 30,1 <= C <= 200)
现在问你怎么安排这C头牛到K台机器挤奶,使得需要 走最长路程到挤奶机器的奶牛所走的路程最少,求出 这个最小值。

83ab9faaaa259b33a85ad91eb5550efa.png

利用Floyd算法求出每个奶牛到每个挤奶机的最短 距离。
则题目变为:
已知C头奶牛到K个挤奶机的距离,每个挤奶机只 能有M个奶牛,每个奶牛只能去一台挤奶机,求 这些奶牛到其要去的挤奶机距离的最大值的最小 值。

网络流模型:

每个奶牛最终都只能到达一个挤奶器,每个挤奶器 只能有M个奶牛,可把奶牛看做网络流中的流。 每个奶牛和挤奶器都是一个节点,添加一个源,连 边到所有奶牛节点,这些边容量都是1。 添加一个汇点,每个挤奶器都连边到它。这些边的 容量都是M

先假定一个最大距离的的最小值 maxdist, 在上述图 中,如果奶牛节点i和挤奶器节点j之间的距离<= maxdist,则从i节点连一条边到j节点,表示奶牛i可以 到挤奶器j去挤奶。该边容量为1。该图上的最大流如 果是C(奶牛数),那么就说明假设的 maxdist成立, 则减小 maxdist再试
总之,要二分 maxdist, 对每个maxdist值,都重新构 图,看其最大流是否是C,然后再决定减少或增加 maxdist

5.Poj 1149 pigs

 Mirko养着一些猪 猪关在一些猪圈里面 猪圈是锁着的 他自己没有钥匙(汗)
 只有要来买猪的顾客才有钥匙
 顾客依次来 每个顾客会用他的钥匙打开一些猪圈 买 走一些猪 然后锁上
 在锁上之前 Mirko有机会重新分配这几个已打开猪圈 的猪
 现在给出一开始每个猪圈的猪数 每个顾客所有的钥匙 和要买走的猪数 问Mirko最多能卖掉几头猪

数据规模

 猪圈数n<=1000  顾客数m<=100  每个猪圈的猪数不超过1000  假设猪圈容量无限

b17f1c5b002f15cf1c8f210c8f16e782.png

a1f43655ae44f6b41c0d0c5adbd695e2.png

1) 三个顾客,就有三轮交易,每一轮分别都有 3 个猪圈和 1 个顾客的节点。
2) 从源点到第一轮的各个猪圈各有一条边,容量 就是各个猪圈里的猪的初始数量。
3) 从各个顾客到汇点各有一条边,容量就是各个 顾客能买的数量上限。
4)在某一轮中,从该顾客打开的所有猪圈都有一 条边连向该顾客,容量都是 +∞。
5) 最后一轮除外,从每一轮的 i 号猪圈都有一条 边连向下一轮的 i 号猪圈,容量都是 +∞,表示这一 轮剩下的猪可以留到下一轮。
6) 最后一轮除外,从每一轮被打开的所有猪圈, 到下一轮的同样这些猪圈,两两之间都要连一条边, 容量+∞表示它们之间可以任意流通。

这个网络模型的最大流量就是最多能卖出的数量。图 中最多有 2 + N + M × N ≈ 100,000 个节点。 (???)
这个模型虽然很直观,但是节点数太多了,计算速 度肯定会很慢。其实不用再想别的算法,就让我们继 续上面的例子,用合并的方法来简化这个网络模型。

cd6575d12b9fad87feddd6a44713b97c.png

用以下3条规律合并节点:
规律 1. 如果几个节点的流量的来源完全相同, 则可以把它们合并成一个。
规律 2. 如果几个节点的流量的去向完全相同, 则可以把它们合并成一个。
规律 3. 如果从点 u 到点 v 有一条容量为 +∞ 的边,并且 u 是 v 的唯一流量来源,或者 v 是 u 的唯一流量去向,则可以把 u 和 v 合并成一个 节点。

c26b179c5eee0cfc210250a8e15497e7.png

68ebc0c9f0c69b13f6915d77849cdb5c.png

51448829d405a4db3bc6ffba72de0329.png

从上图 重新总结一下构造这个网络流模型的规则:
1)每个顾客分别用一个节点来表示。
2)对于每个猪圈的第一个顾客,从源点向他连一条边, 容量就是该猪圈里的猪的初始数量。如果从源点到一名 顾客有多条边,则可以把它们合并成一条,容量相加。
3)对于每个猪圈,假设有 n 个顾客打开过它,则对所有 整数 i ∈ [1, n),从该猪圈的第 i 个顾客向第 i + 1 个顾 客连一条边,容量为 +∞。
4)从各个顾客到汇点各有一条边,容量是各个顾客能买 的数量上限。 新的网络模型中最多只有 2 + N = 102 个节点,计算速度 就可以相当快了。
可以这样理解这个新的网络模型:对于 某一个顾客,如果他打开了猪圈 h,则在他走后,他打开的 所有猪圈里剩下的猪都有可能被换到 h 中,因而这些猪都 有可能被 h 的下一个顾客买走。所以对于一个顾客打开的 所有猪圈,从该顾客到各猪圈的下一个顾客,都要连一条 容量为 +∞ 的边。 在面对网络流问题时,如果一时想不出很好的构图方法, 不如先构造一个最直观的模型,然后再用合并节点和边的 方法来简直化这个模型。经过简化以后,好的构图思路自 然就会涌现出来了。这是解决网络流问题的一个好方法。

6.计划选择问题

e8ca5f8c54070ed3384f2ea9d23a01de.png

e2a3cc48dfe40601f2d6646e9231e5eb.png

eb543e822ef4b498569bfe476b2e0fcb.png

以上解法可以理解为将计划所给予的收益流过所需设备,如果无法流满设备至 t 的边,代表执行计划不合成本,最小割将选择穿过 s 到计划的边而非穿过设备到 t 的边。

参考文献:

https://www.cnblogs.com/liu-runda/p/6262832.html

http://old.orzsiyuan.com/articles/algorithm-Network-Flow-Maximum-Flow/

http://acm.pku.edu.cn/summerschool/gw_netflow.pdf

最直白的网络流课件https://wenku.baidu.com/view/74db84df50e2524de5187ecf.html?from=search

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值