关于网络最大流问题,外教根本解释不清楚!

外教上课举得例子,我觉得很离谱
没看懂为什么可以在0/7的地方再加一个逆向的1/7
用Ford fulkerson算只有5捏
是他错了还是我没理解清楚?

img

img

他例子错了吧,那个反向边有问题,最大流是5

他例子错了

给你找了两篇挺详细的
https://zhuanlan.zhihu.com/p/377750334
https://blog.csdn.net/weixin_38168173/article/details/101485500

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
网络最大流问题是寻找一个网络流图中从源点到汇点的最大流量。以下是对其基本概念和算法的解释,以及一个示例代码。

网络最大流问题基本概念:

在网络最大流问题中,流量指两个相邻节点之间的最大流动量。 在一个流图中,源点s表示流的起点,汇点T表示流的结束。

在网络最大流问题中,最重要的问题是如何找到增广路径,这是一个从源点到汇点的路径,其流量可以增加到整个网络流中。 在这种情况下,即使接收流来自汇点的节点也可以让更多流流到汇点。

算法思路

Ford-Fulkerson算法是一种寻找增广路径并增加流量的算法。它演示了通过不断增加当前最大流量的方法找到整个网络流的最大流。

Ford-Fulkerson算法的基本思路如下:

  1. 初始情况下,所有从源点可达的路径都是未使用的。
  2. 选择一条未使用的路径并找到其路径上的最小权重。
  3. 更新该路径上的边的权重值。
  4. 重复步骤2和步骤3,直到不存在从源点到汇点的可行路径。

代码部分

下面是一个使用python实现的Ford-Fulkerson算法的示例代码。 在此示例中,设网络图的节点权重矩阵为graph。

# Ford-Fulkerson算法实现:
# graph:有向带权图矩阵
# start:源点
# end:汇点
# 返回最大流

def ford_fulkerson(graph, start, end):
    # 初始化
    res_graph = []
    for i in graph:
        res_i = []
        for j in i:
            res_i.append(j)
        res_graph.append(res_i)
 
    remaining_capacity = [-1]*len(graph)  # 存储每个节点的剩余容量
    path_history = [-1]*len(graph)  # 存储增广路径的历史记录
    result = 0  # 最终的最大流量
 
    while True:  # 能找到增广路径就一直找(每次找到的增广路径并不一定是最优解)
        max_flow, path_history = bfs(res_graph, start, end, remaining_capacity, path_history)
        if max_flow == 0:  # 找不到增广路径了,直接跳出循环
            break
        result += max_flow  # 将最大流量加入最终的结果中
        i = end
        while i != start:
            j = path_history[i]
            res_graph[j][i] -= max_flow  # 更新地图上对应的边的剩余容量
            res_graph[i][j] += max_flow
            i = j
    return result


# BFS查找增广路径
def bfs(graph, start, end, remaining_capacity, path_history):
    # 初始化
    maximum_flow = 0  # 增广路径上最小剩余容量
    for i in range(len(graph)):
        remaining_capacity[i] = -1
        path_history[i] = -1
    
    q = []
    q.append(start)  # 添加源点
    while len(q) != 0:
        node = q.pop(0)  # 取出队列第一个元素
        for i in range(len(graph)):
            if graph[node][i] == 0:  # 非连通节点跳过
                continue
            if remaining_capacity[i] == -1:
                # 找到一条可行路径
                remaining_capacity[i] = graph[node][i]
                path_history[i] = node
                if i == end:  # 到达汇点,返回路径上最小剩余容量
                    maximum_flow = remaining_capacity[i]
                    return maximum_flow, path_history
                else:  # 没到达汇点,继续BFS
                    q.append(i)
            else:
                # 已经发现过当前节点,需要更新剩余容量
                if remaining_capacity[i] > min(remaining_capacity[node], graph[node][i]):
                    remaining_capacity[i] = min(remaining_capacity[node], graph[node][i])
                    path_history[i] = node
                if i == end:
                    maximum_flow = remaining_capacity[i]
                    return maximum_flow, path_history
    return 0, path_history


graph = [[0, 16, 13, 0, 0, 0],
         [0, 0, 10, 12, 0, 0],
         [0, 4, 0, 0, 14, 0],
         [0, 0, 9, 0, 0, 20],
         [0, 0, 0, 7, 0, 4],
         [0, 0, 0, 0, 0, 0]]
start, end = 0, 5
print(ford_fulkerson(graph, start, end))

在这个示例中,graph矩阵表示一个有向带权图。 执行算法后,将输出5,这是从源点到汇点的最大流量。 输出的结果对网络中的边仅进行了更新,未对原矩阵graph进行修改。
如果我的回答解决了您的问题,请采纳!