如果理解了最大流连续增广路算法的思维, 理解这个算法还是很简单的。
结构体存储信息:
分别为边的起点、终点、容量、当前流量、费用、下一条边的编号。
struct Edge
{
int from, to, cap, flow, cost, next;
};
Edge edge[MAXM];
int head[MAXN], edgenum;
算法实现过程:
1,每次查找是否 存在源点到汇点的可增广路径,并用pre[ i ]记录路径上到达点i 的 边 的编号。这里的路径指的是 —— 源点到汇点的最短路(边权为费用) 且 路径上所有边都不能满流;
2,若存在这样的路径,从汇点沿着pre数组向前找,找到该路径上可以增广的流量Min(当然是所有边中剩余流量最小的)。再从汇点遍历一次,正向边增加流量Min,反向边减少Min,总费用累加Min * edge[i].cost,总流量累加Min。
模板:
建图没有写,毕竟图论建图没有模板 o(╯□╰)o
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <