博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最小费用最大流
阅读量:5934 次
发布时间:2019-06-19

本文共 896 字,大约阅读时间需要 2 分钟。

最小费用最大流一般用邻接表来实现,因为邻接矩阵不能处理平行边等等;而一条有向边是要储存两条信息,无向图的话要拆成两条有向边处理,相当于变为4条边,这也是邻接矩阵不能做到的

然后最小费用最大流的原理就不讲了,讲一下实现的要注意的问题和一些技巧

1.用结构体数组来保存边,最好从下标0开始保存不要从下标1开始保存,因为增广的时候需要用到位运算,从下标1保存不利于位运算

2.为了满足上面的位运算的要求,除了从下标0开始外,储存边的顺序也有讲究,以一条无向边做例子

(u,v),cap,cost,flow=0;  //一开始流量为0

/****有向边u---->v****/

add(i,u,v,cap,cost,flow);

add(i+1,v,u,0,-cost,flow);

/****有向边u---->v****/

/****有向边v---->u****/

add(i+2,v,u,cap,cost,flow);

add(i+3,u,v,0,-cost,flow);

/****有向边v---->u****/

add函数在添加这4个位信息的顺序不能搞乱

3.记录路径:如果是邻接矩阵记录前驱p[v]=u,表示一条边u--->v,u就是v的前驱

所以找出整条路径就是一个循环 for(u=t; u!=s; u=p[u])  

邻接表p[v]=i;  //i表示的是第i条边,那么它的前驱应该是e[i].u,即在这条边的信息内部

所以找出整条路径是  for(i=p[t]; i!=-1; i=p[e[i].u])  //i表示的是边的标号

4.最小费用最大流:

I.在还能增流的条件下,以单位费用作为权去求源点到汇点最短路并且需要记录路径,但记住不要改变流量,改变流量是增广的时候做的,因为单位费用可能有负值所以用spfa。

II.如果能得到到汇点的最短路,说明还没到达最小费用最大流,那么就沿刚才记录的路径返回,找出最小残余流量

III.增广:即再沿路径返回一次,添加残余流量,反向则减少残余流量

IV.更新最大流,和最小费用 即F+=min; C+=d[t]*min;  //min是本次的最小参与流量

转载地址:http://qbctx.baihongyu.com/

你可能感兴趣的文章
linux -- ubuntu 通过命令行,设置文件及其子文件的权限
查看>>
Go 语言环境搭建
查看>>
sql常用语句
查看>>
PixelFormat 枚举
查看>>
多媒体之录音
查看>>
jQuery ajax - ajax() 方法详解
查看>>
什么是“对用户友好”
查看>>
android 获取网络类型名称2G 3G 4G wifi
查看>>
MySQL thread pool【转】
查看>>
开源数据汇集工具
查看>>
几本自然语言处理入门书
查看>>
java根据本地Ip获取mac地址
查看>>
cocos2d-x路~使得第一个字游戏(一个)
查看>>
SQLServer:什么是主键(PK)和外键(FK)?
查看>>
Android开发之获取设备的屏幕信息和px dp之间的转换
查看>>
.NET中的动态编译
查看>>
Android开发UI之Action Bar
查看>>
在Oracle中使用Guid
查看>>
iOS 在不添加库的情况下 通过抽象类来获取自己想要的方法
查看>>
罗将公布手机锤,我感到深深的内疚
查看>>