結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2020-03-18 02:24:06 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 82 ms / 2,000 ms |
コード長 | 4,027 bytes |
コンパイル時間 | 124 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 13,312 KB |
最終ジャッジ日時 | 2024-09-23 07:25:15 |
合計ジャッジ時間 | 4,456 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
#!/usr/bin/env python3.8# %%import sysread = sys.stdin.buffer.readreadline = sys.stdin.buffer.readlinereadlines = sys.stdin.buffer.readlinesfrom collections import deque# %%class Dinic:def __init__(self, N, source, sink):self.N = Nself.G = [[] for _ in range(N)]self.source = sourceself.sink = sinkdef add_edge(self, fr, to, cap):n1 = len(self.G[fr])n2 = len(self.G[to])self.G[fr].append([to, cap, n2])self.G[to].append([fr, 0, n1]) # 逆辺を cap 0 で追加def add_edge_undirected(self, fr, to, cap):n1 = len(self.G[fr])n2 = len(self.G[to])self.G[fr].append([to, cap, n2])self.G[to].append([fr, cap, n1])def bfs(self):level = [0] * self.NG = self.Gsource = self.sourcesink = self.sinkq = deque([source])level[source] = 1pop = q.popleftappend = q.appendwhile q:v = pop()lv = level[v] + 1for to, cap, rev in G[v]:if not cap:continueif level[to]:continuelevel[to] = lvif to == sink:self.level = levelreturnappend(to)self.level = leveldef dfs(self):INF = 10**18G = self.Gsink = self.sinkprog = self.progresslevel = self.levelascend = Falseff = 0stack = [(self.source, INF)]while stack:if ff:# このまま更新だけして戻っていくv, f = stack.pop()p = prog[v]to, cap, rev = G[v][p]G[v][p][1] -= ffG[to][rev][1] += ffcontinuev, f = stack[-1]if v == sink:ff = fstack.pop()continueE = G[v]lv = level[v]if ascend:# 流せずに戻ってきたprog[v] += 1find_flag = Falsefor i in range(prog[v], len(E)):to, cap, rev = E[i]prog[v] = iif not cap:continueif level[to] <= lv:continuefind_flag = Truebreakif not find_flag:ascend = Truestack.pop()continueascend = Falsex = f if f < cap else capstack.append((to, x))return ffdef max_flow(self):flow = 0while True:self.bfs()if not self.level[self.sink]:return flowself.progress = [0] * self.Nwhile True:f = self.dfs()if not f:breakflow += freturn flow# %%H, W = map(int, readline().split())S = list(''.join(read().decode().split()))# %%source = H * Wsink = H * W + 1dinic = Dinic(N=H * W + 2, source=source, sink=sink)for h in range(H - 1):for w in range(W):i = W * h + wj = i + Wif S[i] == 'b' and S[j] == 'w':dinic.add_edge(i, j, 1)elif S[i] == 'w' and S[j] == 'b':dinic.add_edge(j, i, 1)for h in range(H):for w in range(W - 1):i = W * h + wj = i + 1if S[i] == 'b' and S[j] == 'w':dinic.add_edge(i, j, 1)elif S[i] == 'w' and S[j] == 'b':dinic.add_edge(j, i, 1)for i in range(H * W):if S[i] == 'b':dinic.add_edge(source, i, 1)elif S[i] == 'w':dinic.add_edge(i, sink, 1)# %%f = dinic.max_flow()# %%B = S.count('b')W = S.count('w')score = 100 * fB -= fW -= fx = min(B, W)score += 10 * xB -= xW -= xscore += B + Wprint(score)