C++ Edmonds-Karp与Ford-Fulkerson算法求解最大流问题
最大流问题是图论中的经典问题,旨在寻找从源节点到汇节点的最大流量。Edmonds-Karp和Ford-Fulkerson算法都是用于求解最大流问题的经典算法。本文将会介绍这两种算法的实现,并附上完整的C++代码。
Edmonds-Karp算法
该算法的核心在于使用广度优先搜索(BFS)来查找增广路径。增广路径指的是从源节点到汇节点的一条路径,其中每条边的残量大于0且最小,称为瓶颈容量。对于找到的增广路径,可以通过增加瓶颈容量来增加总的流量。
具体实现过程如下:
-
首先给每个边赋予一个初始的残量值,初始化为图的源节点到其它节点的流量上限;
-
在每次查找增广路径时,使用BFS来搜索一条到汇节点的路径,并计算出路径上残量最小的边的残量值;
-
在找到增广路径之后,更新所有路径上的边的残量值,并累加最大流量;
-
重复执行步骤2和3,直到无法找到增广路径。
以下是该算法的C++实现代码:
const int MAX = 100;
int n;
int capacity[MAX][MAX], flow[MAX][MAX];
int parent[MAX];
int bfs(int s, int t) {
memset(parent, -1, sizeof(parent));
parent[s] = -2;
queue<pair<int, int>> q;
q.push({s, INT_MAX});