結果
問題 | No.2713 Just Solitaire |
ユーザー |
![]() |
提出日時 | 2025-03-20 21:16:59 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 105 ms / 2,000 ms |
コード長 | 3,140 bytes |
コンパイル時間 | 135 ms |
コンパイル使用メモリ | 82,572 KB |
実行使用メモリ | 78,700 KB |
最終ジャッジ日時 | 2025-03-20 21:18:03 |
合計ジャッジ時間 | 3,200 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 32 |
ソースコード
from collections import dequeclass Edge:def __init__(self, to, rev, capacity):self.to = toself.rev = revself.capacity = capacityclass MaxFlow:def __init__(self, n):self.size = nself.graph = [[] for _ in range(n)]def add_edge(self, fr, to, cap):forward = Edge(to, len(self.graph[to]), cap)backward = Edge(fr, len(self.graph[fr]), 0)self.graph[fr].append(forward)self.graph[to].append(backward)def bfs_level(self, s, t, level):q = deque()level[:] = [-1] * self.sizelevel[s] = 0q.append(s)while q:v = q.popleft()for edge in self.graph[v]:if edge.capacity > 0 and level[edge.to] == -1:level[edge.to] = level[v] + 1q.append(edge.to)if edge.to == t:returndef dfs_flow(self, v, t, upTo, iter_, level):if v == t:return upTofor i in range(iter_[v], len(self.graph[v])):edge = self.graph[v][i]if edge.capacity > 0 and level[v] < level[edge.to]:d = self.dfs_flow(edge.to, t, min(upTo, edge.capacity), iter_, level)if d > 0:edge.capacity -= dself.graph[edge.to][edge.rev].capacity += dreturn diter_[v] += 1return 0def max_flow(self, s, t):flow = 0level = [-1] * self.sizewhile True:self.bfs_level(s, t, level)if level[t] == -1:return flowiter_ = [0] * self.sizewhile True:f = self.dfs_flow(s, t, float('inf'), iter_, level)if f == 0:breakflow += flevel = [-1] * self.sizedef main():import sysinput = sys.stdin.readdata = input().split()idx = 0N = int(data[idx])M = int(data[idx + 1])idx +=2A = list(map(int, data[idx:idx+N]))idx +=NB = list(map(int, data[idx:idx+M]))idx +=Mbonuses = []for _ in range(M):K_i = int(data[idx])C_i = list(map(int, data[idx +1 : idx+1+K_i]))bonuses.append( (K_i, C_i) )idx +=1 + K_isum_b = sum(B)INF = 1e18# Nodes:# source = 0# bonuses 1..M# cards M+1 ... M+N# sink = M + N + 1s = 0t = M + N + 1size = t +1mf = MaxFlow(size)for i in range(M):cap = B[i]mf.add_edge(s, i+1, cap)mf.add_edge(i+1, t, 0)for j in range(N):card_node = M +1 + jcap = A[j]mf.add_edge(card_node, t, cap)mf.add_edge(s, card_node, 0)for i in range(M):K_i, C_list = bonuses[i]for c in C_list:card_node = M + cmf.add_edge(i+1, card_node, INF)max_flow = mf.max_flow(s, t)ans = sum_b - max_flowprint(ans)if __name__ == "__main__":main()