数学建模系列-优化模型(二)---图论模型(三)

本文深入探讨网络最大流问题,介绍了其定义、条件和三大定理,并讲解了两种求解最大流问题的算法:增广路算法(福德-福克森算法)和迪尼克算法。通过实例和代码解释了算法的实现过程。
摘要由CSDN通过智能技术生成

书接上回,我们本次研究的是网络最大产流问题。

1.什么是网络最大流?
就是一个物流、运油、运水等等问题的通解,怎么样才能让我出发点到接受点每小时运输量最大呢?
条件:
1.有容量限制
2.是或者可转化为但输入单输出的样式
3.有向
三大定理:
第一个:C代表每条边的容量,F代表每条边目前的水流量,则必定有F<=C.
第二个:任意一个节点,流入水量必定等于流出水量,否则细思极恐.(源点和汇点不算,显然自来水厂的水来自哪里都无所谓.)
第三个:对于任何一条边,如果u向v流了f的流量,则v必定向u流了-f的流量.

2.如何解决最大流问题?
两个思路:
1.增广路算法
基于贪心算法,不断地寻找一条从源点到汇点的能够增加流量的路径,直到找不出为止.
福德-福克森算法的流程
在这里插入图片描述
1.对定点标号,(0,+无穷),0表达前向、后向。
2.(深度优先:不懂得看上一讲)对于临界点进行标注。
后面记录剩余的裕量,一直到最后一点。
3.前向:+,表示增量、取裕量作为改变量。后向:-,表示减量,后向弧不能是0容量的,取流量作为该变量。
4. 画出所有的路径,直到重点被标号。
5. 累加所有的裕量和本来的流量即可得到最大流。

代码如下:
在这里插入图片描述

2.迪尼克算法
思想:1.通过bfs建立分层图.
分层图的建立方法:从源点开始,寻找每一个点到源点的最短距离(边的权值视为1).注意边的剩余流量必须大于0.
2.通过dfs寻找增广路并循环直到没有增广路.
3.循环上述操作,直到bfs无法到达汇点.
4.输出答案.
其实就是上上一阶说的动态规划算法。

代码如下:

/*
默认源点为1,汇点为n.
这个代码加了一个当前弧优化.
所谓当前弧优化就是记录下当前dfs到哪一条弧,前面的弧因为fv-fu!=0不需要再考虑了.
使用当前弧优化之后快了很多.
可以先写没有当前弧优化的dinic,把代码里面的cur数组去掉,其它地方全部替换成head就可以了.
*/
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
const int tamate=2e4,inf=0x3f3f3f3f;//好吧,我每次写代码都改变大N的名称是有原因的.
struct node{
   int next,to,w;}edge[tamate<<1|15];
int cnt,head[tamate<<1|15];
void add(int u,int v,int w){
   edge[cnt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值