网络流最大流算法(ISAP算法及DINIC算法)

本文介绍了网络流中的ISAP(逆序_shortest_path)和DINIC算法,用于解决有向无环图中最大流的问题。ISAP算法通过逆序求解层次并寻找增广路径,而DINIC算法则通过层次划分寻找最短路径增广。以一道实际题目为例,展示了如何应用这两种算法,并提供了相应的代码实现,可用于解决类似问题。
摘要由CSDN通过智能技术生成

这些算法网络中解释都有,所有以下是根据题目应用,代码中有注释,方便理解,ISAP算法就是通过先bfs一遍建立逆序求层数,然后每次都进行维护求最短路来求增广路径,下次查找建立在上次查找的最小路径的源点进行继续查找,DINIC即是通过顺序,每次找最短路径前都进行一次层次的划分(相当于先找出这次查找可能的最小路径长度),再来求最短路增广路径,直至无法划分层次出现断层。下面用两个方法来做这道题,可以作为模板使用

题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=4280

题意:有N个岛屿,M条路线,每条路线连接两个岛屿,并且每条路有最大客流量,这是无向的,就是可以过去也可以回来,现在求最西边到最东边的岛屿,最多有多少人可以过去,每次保证最东边和最西边岛屿只有一个。显示输入N行x,y左边,后面接着路线和客流量

题解:裸算法,直接求即可,ISAP比较好,时间快

代码:

ISAP算法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#define DIAN_MAX 435050
#define BIAN_MAX 435050
#define INF 0xfffffff

using namespace std;
typedef struct
{
    int from,tail,cost,next;
}Edge;
int n,m;//n为点的数量,m为边的数量
Edge edge[BIAN_MAX];  //邻接表存储边
int ecount;         //存储边的当前位置
int head[DIAN_MAX];  //点头数组
int copyhead[DIAN_MAX];//head的复制版
int layer[DIAN_MAX];  //层次数组
int gap[DIAN_MAX];  //gap,用于优化该算法,只要出现断层,就说明该算法可以结束了
int myqueue[DIAN_MAX];  //自定义的队列
int start,tail;      //开始点和终止点
int edgestack[DIAN_MAX];  //自定义栈,用于存放一条起始点到终点的最短路路径
void addEdge(int s,int e,int cost)//针对无向和有向皆可
{
    edge[ecount].from=s;
    edge[ecount].tail=e;
    edge[ecount].cost=cost;
    edge[ecount].next=head[s];
    head[s]=ecount++;
    //反向路径,用于后悔的情况
    edge[ecount].from=
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值