結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
|
提出日時 | 2022-12-25 19:26:05 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 68 ms / 2,000 ms |
コード長 | 2,348 bytes |
コンパイル時間 | 250 ms |
コンパイル使用メモリ | 81,716 KB |
実行使用メモリ | 74,228 KB |
最終ジャッジ日時 | 2024-11-19 09:37:54 |
合計ジャッジ時間 | 2,104 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
ソースコード
from collections import dequeclass Dinic:def __init__(self, n, flow_limit):self.vertices = nself.flow_limit = flow_limitself.links = [[] for _ in range(n)]self.level = Noneself.progress = Nonedef add_link(self, f, t, cap):from_id = len(self.links[f])to_id = len(self.links[t])if f == t:to_id += 1self.links[f].append([cap, t, to_id])self.links[t].append([0, f, from_id])def bfs(self, src, dst):level = [-1 for _ in range(self.vertices)]level[src] = 0dq = deque([src])while len(dq) > 0:cur = dq.popleft()for cap, nxt, _ in self.links[cur]:if cap > 0 and level[nxt] < 0:level[nxt] = level[cur] + 1dq.append(nxt)self.level = levelreturn level[dst] != -1def dfs(self, cur, src, up):if cur == src:return upans = 0lv_cur = self.level[cur]for i in range(self.progress[cur], len(self.links[cur])):self.progress[cur] += 1cap, nxt, rev = self.links[cur][i]if self.level[nxt] >= lv_cur or self.links[nxt][rev][0] == 0:continued = self.dfs(nxt, src, min(up - ans, self.links[nxt][rev][0]))if d <= 0:continueself.links[cur][i][0] += dself.links[nxt][rev][0] -= dans += dif ans == up:breakreturn ansdef max_flow(self, src, dst):ans = 0while ans < self.flow_limit:if not self.bfs(src, dst):breakself.progress = [-1 for _ in range(self.vertices)]while ans < self.flow_limit:f = self.dfs(dst, src, self.flow_limit - ans)if f <= 0:breakans += freturn ansINF = 10 ** 13w = int(input())n = int(input())j = list(map(int, input().split()))m = int(input())c = list(map(int, input().split()))src = n + mdst = src + 1mf = Dinic(n + m + 2, INF)banned = [[False for _ in range(n)] for _ in range(m)]for u in range(m):_, *xs = list(map(int, input().split()))for v in xs:banned[u][v - 1] = Truefor v in range(n):mf.add_link(src, v, j[v])for u in range(m):mf.add_link(n + u, dst, c[u])for u in range(m):for v in range(n):if not banned[u][v]:mf.add_link(v, n + u, INF)ans = mf.max_flow(src, dst)if ans < w:print("BANSAKUTSUKITA")else:print("SHIROBAKO")