結果
問題 | No.1984 [Cherry 4th Tune *] Dilemma |
ユーザー |
![]() |
提出日時 | 2022-06-17 23:22:41 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 110 ms / 2,000 ms |
コード長 | 3,293 bytes |
コンパイル時間 | 229 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 77,952 KB |
最終ジャッジ日時 | 2024-11-08 14:05:15 |
合計ジャッジ時間 | 10,398 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 68 |
ソースコード
import sysinput = sys.stdin.readlineclass Dinic:class Edge:def __init__(self, v, cap, rev):self.v = vself.cap = capself.rev = revdef __init__(self, V):self.V = Vself.G = [[] for _ in range(V)]def add_edge(self, u, v, cap):self.G[u].append(self.Edge(v, cap, len(self.G[v])))self.G[v].append(self.Edge(u, 0, len(self.G[u])-1))# calculate the shortest distance from sdef bfs(self, s):from collections import dequeself.level = [-1] * self.Vself.level[s] = 0queue = deque()queue.append(s)while queue:u = queue.popleft()for e in self.G[u]:if e.cap > 0 and self.level[e.v] == -1:self.level[e.v] = self.level[u] + 1queue.append(e.v)# find a pathdef dfs(self, u, t, f):if u == t:return fi = self.iter[u]while i < len(self.G[u]):e = self.G[u][i]if e.cap > 0 and self.level[u] < self.level[e.v]:d = self.dfs(e.v, t, min(f, e.cap))if d > 0:e.cap -= dself.G[e.v][e.rev].cap += dreturn di += 1self.iter[u] += 1return 0# find the max flow from s to vdef max_flow(self, s, t):flow = 0INF = 10**18while True:self.bfs(s)if self.level[t] == -1:return flowself.iter = [0] * self.Vwhile True:f = self.dfs(s, t, INF)if f == 0:breakflow += fdef min_cut(self, s):visited = [False] * self.Vst = [s]visited[s] = Truewhile st:u = st.pop()for e in self.G[u]:if e.cap > 0 and not visited[e.v]:visited[e.v] = Truest.append(e.v)return visitedN, M, K, P = map(int, input().split())E = list(map(int, input().split()))F = list(map(int, input().split()))V = list(map(int, input().split()))flow = Dinic(N+M+K+2)s = N+M+Kt = s+1ans = 0for i in range(N):flow.add_edge(s, i, E[i])flow.add_edge(i, t, 0)ans += E[i]for i in range(M):flow.add_edge(s, N+i, 0)flow.add_edge(N+i, t, F[i])ans += F[i]for i in range(K):flow.add_edge(s, N+M+i, 0)flow.add_edge(N+M+i, t, V[i])for i in range(N):_, *A = list(map(int, input().split()))for a in A:a -= 1flow.add_edge(i, N+M+a, 10**18)for i in range(P):I, J = map(int, input().split())I -= 1J -= 1flow.add_edge(I, N+J, 10**18)ans -= flow.max_flow(s, t)use = flow.min_cut(s)goals = []actions = []preps = []for i in range(N+M+K):if i < N:if use[i]:goals.append(i+1)elif i < N+M:if not use[i]:actions.append(i-N+1)else:if use[i]:preps.append(i-N-M+1)print(ans)print(len(goals) + len(actions) + len(preps))for i in preps:print("Preparation", i)for i in goals:print("Goal", i)for i in actions:print("Action", i)