結果
| 問題 |
No.1479 Matrix Eraser
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-20 19:03:15 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 835 ms / 3,000 ms |
| コード長 | 2,345 bytes |
| コンパイル時間 | 158 ms |
| コンパイル使用メモリ | 82,388 KB |
| 実行使用メモリ | 145,432 KB |
| 最終ジャッジ日時 | 2025-03-20 19:04:09 |
| 合計ジャッジ時間 | 20,693 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 39 |
ソースコード
import sys
from collections import defaultdict, deque
def main():
input = sys.stdin.read().split()
idx = 0
H = int(input[idx]); idx +=1
W = int(input[idx]); idx +=1
matrix = []
elements = defaultdict(list)
for i in range(H):
row = list(map(int, input[idx:idx+W]))
idx += W
matrix.append(row)
for j in range(W):
v = row[j]
if v != 0:
elements[v].append((i, j))
sorted_values = sorted(elements.keys(), reverse=True)
total_ops = 0
for v in sorted_values:
nodes = elements[v]
rows = set()
cols = set()
edges = defaultdict(list)
for (i, j) in nodes:
rows.add(i)
cols.add(j)
edges[i].append(j)
graph = {}
for u in rows:
graph[u] = edges[u]
match_U = {}
match_V = {}
dist = {}
def bfs():
queue = deque()
for u in graph:
if u not in match_U:
dist[u] = 0
queue.append(u)
else:
dist[u] = float('inf')
dist[None] = float('inf')
while queue:
u = queue.popleft()
if u is not None:
for v in graph.get(u, []):
if dist.get(match_V.get(v), float('inf')) == float('inf'):
dist[match_V.get(v)] = dist[u] + 1
queue.append(match_V.get(v))
return dist[None] != float('inf')
def dfs(u):
if u is not None:
for v in graph.get(u, []):
if dist.get(match_V.get(v), float('inf')) == dist[u] + 1:
if dfs(match_V.get(v)):
match_U[u] = v
match_V[v] = u
return True
dist[u] = float('inf')
return False
return True
result = 0
while bfs():
for u in graph:
if u not in match_U:
if dfs(u):
result +=1
total_ops += result
print(total_ops)
if __name__ == "__main__":
main()
lam6er