結果
問題 | 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 |
ソースコード
#!/usr/bin/env pypy3# 解説参照後import arrayimport collectionsimport itertoolsimport sysREC_LIMIT = 10000INF = 10 ** 8Edge = 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 = Noneself.rev_edge = dict()self.used = Nonedef get_edges_from(self, vertex):return self.adj_edges[vertex]def add_edge(self, source, sink, capacity):assert source != sinkforward_edge = Edge(source, sink, capacity)backward_edge = Edge(sink, source, 0)self.rev_edge[forward_edge] = backward_edgeself.rev_edge[backward_edge] = forward_edgeself.adj_edges[source].add(forward_edge)self.adj_edges[sink].add(backward_edge)def dfs(self, source, sink, flow):if source == sink:return flowself.used[source] = Truefor edge in self.get_edges_from(source):rest = edge.capacity - self.flow[edge]if self.used[edge.sink] or rest <= 0:continued = self.dfs(edge.sink, sink, min(flow, rest))if d > 0:self.flow[edge] += dself.flow[self.rev_edge[edge]] -= dreturn dreturn 0def ford_fulkerson(self, source, sink):self.flow = collections.defaultdict(int)max_flow = 0while True:self.used = collections.defaultdict(bool)df = self.dfs(source, sink, INF)if df == 0:return max_flowelse:max_flow += dfdef 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]: 作画監督iは原画マンjを嫌っているか?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 = 0sink = n + m + 1network = 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()