結果
| 問題 | No.1316 Maximum Minimum Spanning Tree |
| コンテスト | |
| ユーザー |
hitonanode
|
| 提出日時 | 2020-12-12 22:09:40 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 367 ms / 2,000 ms |
| コード長 | 2,267 bytes |
| 記録 | |
| コンパイル時間 | 230 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 80,240 KB |
| 最終ジャッジ日時 | 2024-09-19 22:30:31 |
| 合計ジャッジ時間 | 18,684 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 78 |
ソースコード
# Python, assuming AC
from collections import deque
class MaxFlow:
def __init__(self, N: int) -> None:
self.N = N
self.edges = [[] for _ in range(N)]
def add_edge(self, s: int, t: int, cap: int) -> None:
e = [t, cap, None]
e[2] = erev = [s, 0, e]
self.edges[s].append(e)
self.edges[t].append(erev)
def bfs(self, s: int, t: int) -> bool:
self.level = [-1] * self.N
self.level[s] = 0
q = deque([s])
while q:
v = q.popleft()
lnxt = self.level[v] + 1
for to, cap, _ in self.edges[v]:
if cap and self.level[to] < 0:
self.level[to] = lnxt
q.append(to)
return self.level[t] >= 0
def dfs_dinic(self, v: int, goal: int, f: int) -> int:
if v == goal:
return f
for e in self.it[v]:
to, cap, rev = e
if cap and self.level[v] < self.level[to]:
d = self.dfs_dinic(to, goal, min(f, cap))
if d:
e[1] -= d
rev[1] += d
return d
return 0
def Dinic(self, s: int, t: int, req: int) -> int:
flow = 0
while self.bfs(s, t) and req:
*self.it, = map(iter, self.edges)
while req:
f = self.dfs_dinic(s, t, req)
if f == 0:
break
flow += f
req -= f
return flow
N, M, K = map(int, input().split())
A = [-1] * M
B = [-1] * M
C = [-1] * M
D = [-1] * M
c2eid = []
for eid in range(M):
A[eid], B[eid], C[eid], D[eid] = map(int, input().split())
c2eid.append((C[eid], eid))
X = [0] * M
for ci, i in sorted(c2eid):
mf = MaxFlow(N + 2)
mf.add_edge(0, A[i], K * N)
mf.add_edge(0, B[i], K * N)
for a, b, x in zip(A, B, X):
mf.add_edge(0, a, x)
mf.add_edge(a, b, x)
for j in range(N):
mf.add_edge(j + 1, N + 1, K)
X[i] = min(D[i], mf.Dinic(0, N + 1, 1 << 60) - K - sum(X))
if sum(X) < K * (N - 1):
print(-1)
else:
print(sum([c * x for c, x in zip(C, X)]))
hitonanode