这些算法网络中解释都有,所有以下是根据题目应用,代码中有注释,方便理解,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=