結果

問題 No.421 しろくろチョコレート
ユーザー lam6er
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

from collections import deque
class HopcroftKarp:
def __init__(self, graph, U, V):
self.graph = graph # adjacency list for left nodes (U)
self.U = U
self.V = V
self.pair_u = [-1] * U # pair for left nodes
self.pair_v = [-1] * V # pair for right nodes
self.dist = [0] * U # distance for BFS
def bfs(self):
queue = deque()
for u in range(self.U):
if self.pair_u[u] == -1:
self.dist[u] = 0
queue.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] + 1
elif self.dist[self.pair_v[v]] == float('inf'):
self.dist[self.pair_v[v]] = self.dist[u] + 1
queue.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] = v
self.pair_v[v] = u
return True
self.dist[u] = float('inf')
return False
return True
def max_matching(self):
result = 0
while self.bfs():
for u in range(self.U):
if self.pair_u[u] == -1:
if self.dfs(u):
result += 1
return result
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N = int(input[idx])
idx += 1
M = int(input[idx])
idx += 1
grid = []
for _ in range(N):
grid.append(input[idx].strip())
idx += 1
w_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)
return
graph = [[] 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 + dj
if 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 = U
total_b = V
remaining_w = total_w - k
remaining_b = total_b - k
m = min(remaining_w, remaining_b)
score = 100 * k + 10 * m + (remaining_w + remaining_b - 2 * m)
print(score)
if __name__ == "__main__":
main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0