結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2016-09-10 12:55:56 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 454 ms / 2,000 ms |
コード長 | 2,818 bytes |
コンパイル時間 | 328 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 16,348 KB |
最終ジャッジ日時 | 2024-09-23 07:08:13 |
合計ジャッジ時間 | 8,869 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
#!/usr/bin/env python3import arrayimport collectionsimport itertoolsimport sysDELTAS = [(1, 0), (-1, 0), (0, 1), (0, -1)]INF = 10 ** 8REC_LIMIT = 10000FlowEdge = collections.namedtuple("FlowEdge", "source sink capacity")class FlowNetwork(object):def __init__(self, num_vertices):self.adj_edges = [set() for _ in range(num_vertices)]self.flow = Noneself.rev_edge = dict()self.used = Nonedef get_edges_from(self, vertex):return self.adj_edges[vertex]def add_edge(self, source, sink, capacity=1):assert source != sinkforward_edge = FlowEdge(source, sink, capacity)backward_edge = FlowEdge(sink, source, 0)self.rev_edge[forward_edge] = backward_edgeself.rev_edge[backward_edge] = forward_edgeself.adj_edges[source].add(forward_edge)self.adj_edges[sink].add(backward_edge)def dfs(self, source, sink, flow):if source == sink:return flowself.used[source] = Truefor edge in self.get_edges_from(source):rest = edge.capacity - self.flow[edge]if self.used[edge.sink] or rest <= 0:continued = self.dfs(edge.sink, sink, min(flow, rest))if d > 0:self.flow[edge] += dself.flow[self.rev_edge[edge]] -= dreturn dreturn 0def ford_fulkerson(self, source, sink):self.flow = collections.defaultdict(int)max_flow = 0while True:self.used = collections.defaultdict(bool)df = self.dfs(source, sink, INF)if df == 0:return max_flowelse:max_flow += dfdef main():sys.setrecursionlimit(REC_LIMIT)n, m = map(int, input().split())board = [input() for _ in range(n)]num_vs = n * m + 2source = n * msink = n * m + 1fn = FlowNetwork(num_vs)white = 0black = 0for r0, c0 in itertools.product(range(n), range(m)):if board[r0][c0] == "w":white += 1w = r0 * m + c0fn.add_edge(source, w)for dr, dc in DELTAS:r, c = r0 + dr, c0 + dcif r < 0 or r >= n or c < 0 or c >= m:continueelif board[r][c] == "b":b = r * m + cfn.add_edge(w, b)fn.add_edge(b, sink)elif board[r0][c0] == "b":black += 1mf = fn.ford_fulkerson(source, sink)ans = mf * 100white -= mfblack -= mfmeth2 = min(white, black)ans += meth2 * 10white -= meth2black -= meth2ans += max(white, black)print(ans)if __name__ == '__main__':main()