c语言最小费用流_用网络单纯形法(network simplex)解最小费用最大流(mincost)问题

本文介绍了如何利用网络单纯形法解决最小费用最大流问题,通过构造虚拟链路和生成树,计算节点的潜力值,并调整链路,不断寻找并优化费用最低的流量分配方案。文中提供了算法的实现思路和基本数据结构,包括节点、链路的定义以及解题过程的关键步骤。
摘要由CSDN通过智能技术生成

该算法的原理来自线性规划,笔者还有没搞懂的地方,这里只谈实现。后面会给出完整的C++代码。

前提假设与问题点总结

事先有所了解的看官可以略过此小节。

如果一个节点是某些链路(或称有向边)的起点且不是任何链路的终点,则该节点为源节点(source);如果一个节点是某些链路的终点且不是任何链路的起点,则该节点为宿节点(sink).

每条链路都可以有一定的流量(flow),其方向必须与链路方向相同;一条链路上的流量允许的最大值称为该链路的容量(capacity)。

根据当前的流量情况,链路可分为三类:

满的(full), 流量已达到最大值,即等于容量

空的(empty), 流量为0

部分满的(partial), 流量大于0但小于容量

最大流问题:对于一个存在源、宿节点的网络,选取其中一个源节点s和一个宿节点t,要求除了这两点外,其他节点上出、入的流量相等。安排各链路的流量,使s的流出、t的流入(显然,两者必相等)达到最大值。

最小费用最大流问题:假设每一单位的流量经过一条链路时都会产生一定的费用(cost), 已知各条链路的费用,给出解决方案,在达到上述最大流的同时,总费用最小。

这里约定流量、费用都是整数值。

解决方法概述

主要分以下步骤:

1. 构造一条虚拟的从s到t的链路,它的容量足够大,大于原本从s流出的所有链路的容量之和,也大于流入t的所有链路的容量之和;它的费用特别高,大于其他所有链路的费用的总和。使其他链路的流量都为0,虚拟链路流量等于其容量。

此时若在原有的链路上发现任意一条从s到t的路径、并将虚拟链路上的一部分流量导入到该条路径上,总费用必然减小。如此最大流和最小费用的问题就统一起来了:为了让费用达到最小,必定要尽量避开那条假设的链路,使更多的流量从原先的链路上经过。

以下图作为例子,cap和cost分别代表容量和费用,s = 0, t = 5:

23aa6bb2ba36175621420f0ce0f98536.png

s和t之间构造一个假设的链路,其容量和费用这里设为7和16,如下图所示:

4c1fa0aef1ea3bbf7ab60dee6e7444d8.png

初始阶段,只有虚拟链路是满的,流量为7,等于容量;其他链路流量均为0:

5d2a994b0eee6cb9e52826465dcd69b2.png

2. 构造一个以t节点为根的生成树。且该树必须包含虚拟链路。

比如对于刚才的例子构造生成树如下(具体的构造步骤等具体到代码时再谈,这里可以不用关心)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值