結果
| 問題 | No.2713 Just Solitaire |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-03-10 01:11:38 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 66 ms / 2,000 ms |
| コード長 | 2,493 bytes |
| 記録 | |
| コンパイル時間 | 176 ms |
| コンパイル使用メモリ | 85,676 KB |
| 実行使用メモリ | 83,576 KB |
| 最終ジャッジ日時 | 2026-03-10 01:11:42 |
| 合計ジャッジ時間 | 2,573 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 32 |
ソースコード
## https://yukicoder.me/problems/no/2713
from collections import deque
class MFGraph:
class Edge:
__slots__ = ("to", "rev", "cap")
def __init__(self, to, rev, cap):
self.to = to
self.rev = rev
self.cap = cap
def __init__(self, n):
self.n = n
self.g = [[] for _ in range(n)]
def add_edge(self, fr, to, cap):
forward = MFGraph.Edge(to, len(self.g[to]), cap)
backward = MFGraph.Edge(fr, len(self.g[fr]), 0)
self.g[fr].append(forward)
self.g[to].append(backward)
def flow(self, s, t):
flow = 0
INF = 10**30
while True:
level = [-1] * self.n
q = deque([s])
level[s] = 0
# BFS
while q:
v = q.popleft()
for e in self.g[v]:
if e.cap > 0 and level[e.to] < 0:
level[e.to] = level[v] + 1
q.append(e.to)
if level[t] < 0:
return flow
it = [0] * self.n
def dfs(v, f):
if v == t:
return f
for i in range(it[v], len(self.g[v])):
it[v] = i
e = self.g[v][i]
if e.cap > 0 and level[v] < level[e.to]:
d = dfs(e.to, min(f, e.cap))
if d > 0:
e.cap -= d
self.g[e.to][e.rev].cap += d
return d
return 0
while True:
f = dfs(s, INF)
if f == 0:
break
flow += f
MAX_CAPACITY = 10 ** 18
def main():
N, M = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
values = []
for _ in range(M):
t = tuple(map(int, input().split()))
values.append(t)
# 燃やす埋める問題として解く
mf_graph = MFGraph(2 + N + M)
for i in range(N):
mf_graph.add_edge(0, 1 + i, A[i])
for i in range(M):
mf_graph.add_edge(1 + N + i, 1 + N + M, B[i])
for from_i in range(M):
v = values[from_i]
for to_i in v[1:]:
mf_graph.add_edge(to_i, 1 + N + from_i, MAX_CAPACITY)
ans = mf_graph.flow(0, 1 + N + M)
print(sum(B) - ans)
if __name__ == "__main__":
main()