結果
問題 | No.957 植林 |
ユーザー |
![]() |
提出日時 | 2025-03-26 15:54:35 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,838 bytes |
コンパイル時間 | 353 ms |
コンパイル使用メモリ | 82,364 KB |
実行使用メモリ | 187,960 KB |
最終ジャッジ日時 | 2025-03-26 15:55:42 |
合計ジャッジ時間 | 17,764 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 15 TLE * 1 -- * 29 |
ソースコード
import sysfrom collections import dequeclass Edge:def __init__(self, to, rev, capacity):self.to = toself.rev = revself.capacity = capacityclass MaxFlow:def __init__(self, n):self.size = nself.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.sizelevel[s] = 0q.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] + 1q.append(edge.to)if edge.to == t:returnreturndef dfs_flow(self, v, t, upTo, iter_, level):if v == t:return upTofor 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 -= dself.graph[edge.to][edge.rev].capacity += dreturn diter_[v] += 1return 0def max_flow(self, s, t):flow = 0level = [-1] * self.sizewhile True:self.bfs_level(s, t, level)if level[t] == -1:return flowiter_ = [0] * self.sizewhile True:f = self.dfs_flow(s, t, float('inf'), iter_, level)if f == 0:breakflow += flevel = [-1] * self.sizereturn flowdef main():H, W = map(int, sys.stdin.readline().split())G = []for _ in range(H):G.append(list(map(int, sys.stdin.readline().split())))R = list(map(int, sys.stdin.readline().split()))C = list(map(int, sys.stdin.readline().split()))# Compute A and BA = []for i in range(H):total = sum(G[i])A.append(R[i] - total)B = []for j in range(W):total = sum(G[i][j] for i in range(H))B.append(C[j] - total)# Compute the sum of positive terms for maximum possibletotal_positive = 0# Create nodes: rows (0..H-1), cols (H..H+W-1), edges (H+W..H+W+H*W-1)edge_node_start = H + Wtotal_nodes = edge_node_start + H * WS = total_nodesT = S + 1mf = MaxFlow(T + 1)INF = 1 << 60# Add row nodesfor i in range(H):a = A[i]if a > 0:mf.add_edge(S, i, a)total_positive += aelse:mf.add_edge(i, T, -a)# Add column nodesfor j in range(W):b = B[j]if b > 0:mf.add_edge(S, H + j, b)total_positive += belse:mf.add_edge(H + j, T, -b)# Add edge nodes for each i,jfor i in range(H):for j in range(W):g = G[i][j]edge_node = edge_node_start + i * W + jif g > 0:mf.add_edge(S, edge_node, g)total_positive += gelse:mf.add_edge(edge_node, T, -g)# Add edges from edge_node to row i and column jmf.add_edge(edge_node, i, INF)mf.add_edge(edge_node, H + j, INF)max_flow_val = mf.max_flow(S, T)result = total_positive - max_flow_valprint(result)if __name__ == "__main__":main()