最小费用最大流(Minimum Cost Maximum Flow, MCMF)是一种网络流算法,用于在网络中找到从源点到汇点的最大流量,同时使得流的总费用最小。这个算法在物流、通信网络、电力系统等领域有广泛应用。
import heapq
def dijkstra(graph, capacity, cost, source, sink):
n = len(graph)
dist = [float('inf')] * n
dist[source] = 0
pq = [(0, source)]
parent = [-1] * n
flow = [0] * n
while pq:
d, u = heapq.heappop(pq)
if u == sink:
break
for v, cap, c in graph[u]:
if cap > flow[v] and dist[u] + c < dist[v]:
dist[v] = dist[u] + c
parent[v] = u
flow[v] = min(cap - flow[v], flow[u])
heapq.heappush(pq, (dist[v], v))
return flow, parent
def min_cost_max_flow(graph, capacity, cost, source, sink):
max_flow = 0
min_cost = 0
flow, parent = dijkstra(graph, capacity, cost, source, sink)
while flow[sink] > 0:
max_flow += flow[sink]
v = sink
while v != source:
u = parent[v]
min_cost += flow[sink] * cost[u][v]
capacity[u][v] -= flow[sink]
capacity[v][u] += flow[sink]
v = u
flow, parent = dijkstra(graph, capacity, cost, source, sink)
return max_flow, min_cost
# Example usage
n = 4
graph = [
[(1, 3, 2), (2, 2, 1)],
[(2, 2, 1), (3, 3, 3)],
[(3, 2, 2)],
[]
]
capacity = [[0, 3, 2, 0],
[0, 0, 2, 3],
[0, 0, 0, 2],
[0, 0, 0, 0]]
cost = [[0, 2, 1, 0],
[0, 0, 1, 3],
[0, 0, 0, 2],
[0, 0, 0, 0]]
source = 0
sink = 3
max_flow, min_cost = min_cost_max_flow(graph, capacity, cost, source, sink)
print("Max Flow:", max_flow)
print("Min Cost:", min_cost)
通过上述步骤和方法,可以有效解决最小费用最大流问题,并在实际应用中优化资源分配和降低成本。
领取专属 10元无门槛券
手把手带您无忧上云