結果

問題 No.177 制作進行の宮森あおいです!
ユーザー はむ吉🐹
提出日時 2016-07-14 22:48:19
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 596 ms / 2,000 ms
コード長 3,159 bytes
コンパイル時間 215 ms
コンパイル使用メモリ 82,176 KB
実行使用メモリ 81,700 KB
最終ジャッジ日時 2024-10-14 17:18:32
合計ジャッジ時間 4,122 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 13
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#!/usr/bin/env pypy3
#
import array
import collections
import itertools
import sys
REC_LIMIT = 10000
INF = 10 ** 8
Edge = collections.namedtuple("Edge", "source sink capacity")
class FlowNetwork(object):
def __init__(self, num_vertices):
self.adj_edges = [set() for _ in range(num_vertices)]
self.flow = None
self.rev_edge = dict()
self.used = None
def get_edges_from(self, vertex):
return self.adj_edges[vertex]
def add_edge(self, source, sink, capacity):
assert source != sink
forward_edge = Edge(source, sink, capacity)
backward_edge = Edge(sink, source, 0)
self.rev_edge[forward_edge] = backward_edge
self.rev_edge[backward_edge] = forward_edge
self.adj_edges[source].add(forward_edge)
self.adj_edges[sink].add(backward_edge)
def dfs(self, source, sink, flow):
if source == sink:
return flow
self.used[source] = True
for edge in self.get_edges_from(source):
rest = edge.capacity - self.flow[edge]
if self.used[edge.sink] or rest <= 0:
continue
d = self.dfs(edge.sink, sink, min(flow, rest))
if d > 0:
self.flow[edge] += d
self.flow[self.rev_edge[edge]] -= d
return d
return 0
def ford_fulkerson(self, source, sink):
self.flow = collections.defaultdict(int)
max_flow = 0
while True:
self.used = collections.defaultdict(bool)
df = self.dfs(source, sink, INF)
if df == 0:
return max_flow
else:
max_flow += df
def main():
sys.setrecursionlimit(REC_LIMIT)
w = int(input())
#
n = int(input())
js = array.array("I", map(int, input().split()))
#
m = int(input())
cs = array.array("I", map(int, input().split()))
# hate[i][j]: ij
hate = [array.array("B", (False for _ in range(n))) for _ in range(m)]
for i in range(m):
qxs = array.array("I", map(lambda x: int(x) - 1, input().split()))
for j in qxs[1:]:
hate[i][j] = True
# 0
# 1, 2, ..., 1 + j, ..., n
# n + 1, n + 2, ..., n + i + 1, ..., n + m
# n + m + 1
num_vertices = n + m + 2 #
source = 0
sink = n + m + 1
network = FlowNetwork(num_vertices)
# ->
for j in range(n):
network.add_edge(0, 1 + j, js[j])
# ->
for i in range(m):
network.add_edge(1 + n + i, sink, cs[i])
# ->
for j, i in itertools.product(range(n), range(m)):
if not hate[i][j]:
network.add_edge(1 + j, 1 + n + i, INF)
mf = network.ford_fulkerson(source, sink)
print("SHIROBAKO" if mf >= w else "BANSAKUTSUKITA")
if __name__ == '__main__':
main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0