本文共 2863 字,大约阅读时间需要 9 分钟。
??????n????????????????????????????????????????????????????????????????????????????????????????
??????????
??????????????????????????
import sysfrom collections import dequeclass Edge: def __init__(self, to, rev, capacity): self.to = to self.rev = rev self.capacity = capacityclass MinCut: def __init__(self, n): self.size = n self.graph = [[] for _ in range(n)] def add_edge(self, fr, to, cap): forward = Edge(to, len(self.graph[to]), cap) backward = Edge(fr, len(self.graph[fr]), 0) self.graph[fr].append(forward) self.graph[to].append(backward) def bfs_level(self, s, t, level): q = deque() level[:] = [-1]*self.size level[s] = 0 q.append(s) while q: v = q.popleft() for edge in self.graph[v]: if edge.capacity > 0 and level[edge.to] == -1: level[edge.to] = level[v] + 1 q.append(edge.to) if edge.to == t: return return def dfs_flow(self, v, t, upTo, iter_, level): if v == t: return upTo for i in range(iter_[v], len(self.graph[v])): edge = self.graph[v][i] if edge.capacity > 0 and level[v] < level[edge.to]: d = self.dfs_flow(edge.to, t, min(upTo, edge.capacity), iter_, level) if d > 0: edge.capacity -= d self.graph[edge.to][edge.rev].capacity += d return d iter_[v] +=1 return 0 def min_cut(self, s, t): level = [-1]*self.size self.bfs_level(s, t, level) if level[t] == -1: return 0 iter_ = [0]*self.size flow = self.dfs_flow(s, t, float('inf'), iter_, level) return flowdef main(): n, m = map(int, sys.stdin.readline().split()) a = list(map(int, sys.stdin.readline().split())) edges = [[] for _ in range(n)] for _ in range(m): u, v = map(int, sys.stdin.readline().split()) u -=1 v -=1 edges[u].append(v) edges[v].append(u) size = 2 * n source = 0 sink = 2 * n -1 mc = MinCut(size) for i in range(n): mc.add_edge(source, 2*i, a[i]) mc.add_edge(2*i +1, sink, 1) for u in range(n): for v in edges[u]: mc.add_edge(2*u, 2*v, 1) mc.add_edge(2*v, 2*u, 1) min_flow = mc.min_cut(source, sink) print(min_flow)if __name__ == "__main__": main() ???????????????????????
转载地址:http://vfmu.baihongyu.com/