結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
![]() |
提出日時 | 2022-12-17 11:09:40 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 106 ms / 2,000 ms |
コード長 | 2,543 bytes |
コンパイル時間 | 2,194 ms |
コンパイル使用メモリ | 82,084 KB |
実行使用メモリ | 79,104 KB |
最終ジャッジ日時 | 2024-11-16 19:50:19 |
合計ジャッジ時間 | 2,255 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
ソースコード
from typing import List, Tuple, Callable, TypeVar, Optionalimport sysimport itertoolsimport heapqimport bisectimport mathfrom collections import deque, defaultdictfrom functools import lru_cache, cmp_to_keyinput = sys.stdin.readlineif __file__ != 'prog.py':sys.setrecursionlimit(10 ** 6)def readints(): return map(int, input().split())def readlist(): return list(readints())def readstr(): return input()[:-1]class Dinic:def __init__(self, N, inf=1 << 50):self.N = Nself.G = [[] for _ in range(self.N)]self.inf = infdef add_edge(self, u, v, cap):forward = [cap, v, None]backward = [0, u, None]forward[2] = backwardbackward[2] = forwardself.G[u].append(forward)self.G[v].append(backward)def flow(self, s, t):flow = 0while True:self._bfs(s, t)if self.level[t] is None:return flow*self.iter, = map(iter, self.G)f = self.infwhile f > 0:f = self._dfs(s, t, self.inf)flow += fdef _bfs(self, s, t):self.level = [None] * self.Ndq = deque([s])self.level[s] = 0while dq:v = dq.popleft()for cap, d, _ in self.G[v]:if cap == 0:continueif self.level[d] is None:self.level[d] = self.level[v] + 1dq.append(d)def _dfs(self, u, t, f):if u == t:return ffor e in self.iter[u]:cap, v, rev = eif cap == 0:continueif self.level[v] > self.level[u]:delta = self._dfs(v, t, min(f, cap))if delta > 0:e[0] -= deltarev[0] += deltareturn deltareturn 0W = int(input())N = int(input())J = readlist()M = int(input())C = readlist()comb = [[True for _ in range(M)] for _ in range(N)]for j in range(M):q, *X = readints()for i in X:i -= 1comb[i][j] = Falsesolver = Dinic(N + M + 2)INF = 1 << 50for i in range(N):solver.add_edge(0, i + 1, J[i])for j in range(M):solver.add_edge(N + 1 + j, N + 1 + M, C[j])for i in range(N):for j in range(M):if comb[i][j]:solver.add_edge(i + 1, N + 1 + j, INF)flow = solver.flow(0, N + M + 1)print('SHIROBAKO' if flow >= W else 'BANSAKUTSUKITA')