結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2025-03-20 21:15:29 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,124 bytes |
コンパイル時間 | 167 ms |
コンパイル使用メモリ | 82,096 KB |
実行使用メモリ | 78,468 KB |
最終ジャッジ日時 | 2025-03-20 21:15:54 |
合計ジャッジ時間 | 6,500 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 64 WA * 1 |
ソースコード
from collections import dequeclass HopcroftKarp:def __init__(self, graph, U, V):self.graph = graph # adjacency list for left nodes (U)self.U = Uself.V = Vself.pair_u = [-1] * U # pair for left nodesself.pair_v = [-1] * V # pair for right nodesself.dist = [0] * U # distance for BFSdef bfs(self):queue = deque()for u in range(self.U):if self.pair_u[u] == -1:self.dist[u] = 0queue.append(u)else:self.dist[u] = float('inf')self.dist_null = float('inf')while queue:u = queue.popleft()if self.dist[u] < self.dist_null:for v in self.graph[u]:if self.pair_v[v] == -1:self.dist_null = self.dist[u] + 1elif self.dist[self.pair_v[v]] == float('inf'):self.dist[self.pair_v[v]] = self.dist[u] + 1queue.append(self.pair_v[v])return self.dist_null != float('inf')def dfs(self, u):if u != -1:for v in self.graph[u]:if self.pair_v[v] == -1 or (self.dist[self.pair_v[v]] == self.dist[u] + 1 and self.dfs(self.pair_v[v])):self.pair_u[u] = vself.pair_v[v] = ureturn Trueself.dist[u] = float('inf')return Falsereturn Truedef max_matching(self):result = 0while self.bfs():for u in range(self.U):if self.pair_u[u] == -1:if self.dfs(u):result += 1return resultdef main():import sysinput = sys.stdin.read().split()idx = 0N = int(input[idx])idx += 1M = int(input[idx])idx += 1grid = []for _ in range(N):grid.append(input[idx].strip())idx += 1w_positions = []b_positions = []for i in range(N):for j in range(M):c = grid[i][j]if c == 'w':w_positions.append((i, j))elif c == 'b':b_positions.append((i, j))U = len(w_positions)V = len(b_positions)if U == 0 or V == 0:print(0)returngraph = [[] for _ in range(U)]b_map = {(i, j): idx for idx, (i, j) in enumerate(b_positions)}dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]for u in range(U):i, j = w_positions[u]for di, dj in dirs:ni, nj = i + di, j + djif 0 <= ni < N and 0 <= nj < M:if grid[ni][nj] == 'b' and (ni, nj) in b_map:v = b_map[(ni, nj)]graph[u].append(v)hk = HopcroftKarp(graph, U, V)k = hk.max_matching()total_w = Utotal_b = Vremaining_w = total_w - kremaining_b = total_b - km = min(remaining_w, remaining_b)score = 100 * k + 10 * m + (remaining_w + remaining_b - 2 * m)print(score)if __name__ == "__main__":main()