結果
問題 | No.421 しろくろチョコレート |
ユーザー |
![]() |
提出日時 | 2020-09-25 20:09:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 167 ms / 2,000 ms |
コード長 | 2,585 bytes |
コンパイル時間 | 223 ms |
コンパイル使用メモリ | 81,732 KB |
実行使用メモリ | 79,964 KB |
最終ジャッジ日時 | 2024-09-23 07:30:57 |
合計ジャッジ時間 | 7,145 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
from collections import dequeclass Dinic:def __init__(self, N, inf):self.N = Nself.inf = infself.G = [[] for _ in range(N)]self.level = [0]*Ndef add_edge(self, fr, to, cap):forward = [to, cap, None]forward[2] = backward = [fr, 0, forward]self.G[fr].append(forward)self.G[to].append(backward)def add_multi_edge(self, v1, v2, cap1, cap2):edge1 = [v2, cap1, None]edge1[2] = edge2 = [v1, cap2, edge1]self.G[v1].append(edge1)self.G[v2].append(edge2)def bfs(self, s):self.level = [-1]*self.Ndeq = deque([s])self.level[s] = 0while deq:v = deq.pop()lv = self.level[v] + 1for w, cap, _ in self.G[v]:if cap > 0 and self.level[w] == -1:self.level[w] = lvdeq.appendleft(w)def dfs(self, v, t, f):if v == t:return ffor e in self.iter[v]:w, cap, rev = eif cap > 0 and self.level[v] < self.level[w]:d = self.dfs(w, t, min(f, cap))if d > 0:e[1] -= drev[1] += dreturn dreturn 0def flow(self, s, t):flow = 0while True:self.bfs(s)if self.level[t] == -1:return flow*self.iter, = map(iter, self.G)f = self.infwhile f > 0:f = self.dfs(s, t, self.inf)flow += fimport syssys.setrecursionlimit(10**7)def MI(): return map(int,sys.stdin.readline().rstrip().split())def LS2(): return list(sys.stdin.readline().rstrip()) #空白なしN,M = MI()S = [LS2() for _ in range(N)]Di = Dinic(N*M+2,10000)s,t = N*M,N*M+1white,black = 0,0for i in range(N):for j in range(M):if S[i][j] == '.':continuea = M*i+jif (i+j) % 2 == 0:white += 1Di.add_edge(s,a,1)if 0 <= i-1 and S[i-1][j] != '.':Di.add_edge(a,M*(i-1)+j,1)if i+1 < N and S[i+1][j] != '.':Di.add_edge(a,M*(i+1)+j,1)if 0 <= j-1 and S[i][j-1] != '.':Di.add_edge(a,M*i+j-1,1)if j+1 < M and S[i][j+1] != '.':Di.add_edge(a,M*i+j+1,1)else:black += 1Di.add_edge(a,t,1)flow = Di.flow(s,t)print(100*flow+10*(min(white,black)-flow)+(abs(white-black)))