結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2021-03-02 06:34:15 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 158 ms / 2,000 ms |
コード長 | 2,482 bytes |
コンパイル時間 | 264 ms |
コンパイル使用メモリ | 81,932 KB |
実行使用メモリ | 79,284 KB |
最終ジャッジ日時 | 2024-09-23 07:31:28 |
合計ジャッジ時間 | 7,370 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
from collections import dequeclass Dinic:def __init__(self, n, INF=float('inf')):self.n = nself.INF = INFself.pos = []self.G = [[] for _ in range(n)]self.level = Noneself.iters = Nonedef add_edge(self, fr, to, cap):self.pos.append((fr, len(self.G[fr])))self.G[fr].append([cap, to, len(self.G[to])])self.G[to].append([0, fr, len(self.G[fr])-1])def bfs(self, s):level = [-1]*self.nlevel[s] = 0q = deque([s])while q:v = q.popleft()for cap, to, rev in self.G[v]:if cap > 0 and level[to] < 0:level[to] = level[v]+1q.append(to)self.level = leveldef dfs(self, v, t, flow):if v == t:return flowfor i in range(self.iters[v], len(self.G[v])):self.iters[v] = icap, to, rev = self.G[v][i]if cap > 0 and self.level[v] < self.level[to]:d = self.dfs(to, t, min(flow, cap))if d > 0:self.G[v][i][0] -= dself.G[to][rev][0] += dreturn dreturn 0def max_flow(self, s, t):flow = 0while True:self.bfs(s)if self.level[t] < 0:return flowself.iters = [0]*self.nf = self.dfs(s, t, self.INF)while f > 0:flow += ff = self.dfs(s, t, self.INF)n, m = map(int, input().split())S = [input() for i in range(n)]INF = 10**9dinic = Dinic(n*m+2, INF)w, b = 0, 0s = n*mt = n*m+1for i in range(n):for j in range(m):if (i+j)%2 == 0 and S[i][j] != '.':w += 1dinic.add_edge(s, i*m+j, 1) # source > evenif (i+j)%2 == 1 and S[i][j] != '.':b += 1dinic.add_edge(i*m+j, t, 1) # odd > sinkfor i, row in enumerate(S):for j, c in enumerate(row):v = i*m+jif c == '.' or (i+j)%2 == 1:continuefor di, dj in (-1, 0), (1, 0), (0, -1), (0, 1):ni, nj = i+di, j+djif 0 <= ni < n and 0 <= nj < m:u = ni*m+njif S[ni][nj] != '.':dinic.add_edge(v, u, 1) # even > oddf = dinic.max_flow(s, t)ans = 0ans += f*100w -= fb -= fans += 10*min(w, b)+(max(w, b)-min(w,b))print(ans)