結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
![]() |
提出日時 | 2020-03-24 22:32:14 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 29 ms / 2,000 ms |
コード長 | 2,946 bytes |
コンパイル時間 | 285 ms |
コンパイル使用メモリ | 12,416 KB |
実行使用メモリ | 10,624 KB |
最終ジャッジ日時 | 2025-01-01 18:38:37 |
合計ジャッジ時間 | 1,474 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
ソースコード
#!/usr/bin/ python3.8import sysread = sys.stdin.buffer.readreadline = sys.stdin.buffer.readlinereadlines = sys.stdin.buffer.readlinesfrom collections import dequeclass 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.G; source = self.source; sink = self.sinkq = deque([source])level[source] = 1pop = q.popleft; append = 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, v, f):if v == self.sink:return fG = self.Gprog = self.progresslevel = self.levellv = level[v]E = G[v]for i in range(prog[v], len(E)):to, cap, rev = E[i]prog[v] = iif not cap:continueif level[to] <= lv:continuex = f if f < cap else capff = self.dfs(to, x)if ff:E[i][1] -= ffG[to][rev][1] += ffreturn ffreturn 0def max_flow(self):INF = 10**18flow = 0while True:self.bfs()if not self.level[self.sink]:return flowself.progress = [0] * self.Nwhile True:f = self.dfs(self.source, INF)if not f:breakflow += freturn flowW = int(readline())N = int(readline())J = tuple(map(int, readline().split()))M = int(readline())C = tuple(map(int, readline().split()))source = 0sink = N + M + 1dinic = Dinic(N + M + 2, source, sink)add = dinic.add_edgefor i, x in enumerate(J, 1):add(source, i, x)for i, x in enumerate(C, 1):add(N + i, sink, x)INF = W + 10for i, line in enumerate(readlines(), 1):Q, *X = map(int, line.split())X = set(X)for j in range(1, N + 1):if j in X:continueadd(j, N + i, INF)f = dinic.max_flow()answer = 'SHIROBAKO' if f >= W else 'BANSAKUTSUKITA'print(answer)