結果
| 問題 |
No.119 旅行のツアーの問題
|
| コンテスト | |
| ユーザー |
しらっ亭
|
| 提出日時 | 2015-08-10 04:35:20 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 34 ms / 5,000 ms |
| コード長 | 2,294 bytes |
| コンパイル時間 | 142 ms |
| コンパイル使用メモリ | 12,800 KB |
| 実行使用メモリ | 11,264 KB |
| 最終ジャッジ日時 | 2024-12-21 10:53:11 |
| 合計ジャッジ時間 | 1,763 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 19 |
ソースコード
INF = float('inf')
class Dinic:
class Edge:
def __init__(self, to, cap, rev):
self.to = to
self.cap = cap
self.rev = rev
def __init__(self, V):
self.V = V
self.size = [0 for i in range(V)]
self.G = [[] for i in range(V)]
def add_edge(self, _from, to, cap):
self.G[_from].append(Dinic.Edge(to, cap, self.size[to]))
self.G[to].append(Dinic.Edge(_from, 0, self.size[_from]))
self.size[_from] += 1
self.size[to] += 1
def bfs(self, s):
from collections import deque
level = [-1 for i in range(self.V)]
level[s] = 0
q = deque([s])
while q:
v = q.popleft()
for u in self.G[v]:
if u.cap > 0 and level[u.to] < 0:
level[u.to] = level[v] + 1
q.append(u.to)
return level
def dfs(self, v, t, f):
if v == t: return f
for i in range(self.iterator[v], self.size[v]):
self.iterator[v] = i
edge = self.G[v][i]
if edge.cap > 0 and self.level[v] < self.level[edge.to]:
d = self.dfs(edge.to, t, f if f < edge.cap else edge.cap)
if d > 0:
self.G[v][i].cap -= d
self.G[edge.to][edge.rev].cap += d
return d
return 0
def max_flow(self, s, t):
flow = 0
while True:
self.level = self.bfs(s)
if self.level[t] < 0:
return flow
self.iterator = [0 for i in range(self.V)]
while True:
f = self.dfs(s, t, float('inf'))
if f == 0:
break
flow += f
def solve():
N = int(input())
mf = Dinic(N * 2 + 2)
s = 0
for i in range(N):
b, c = list(map(int, input().split()))
m = max(b, c)
s += m
mf.add_edge(0, i * 2 + 2, m - c)
mf.add_edge(i * 2 + 2, i * 2 + 3, m)
mf.add_edge(i * 2 + 3, 1, m - b)
M = int(input())
for i in range(M):
d, e = list(map(int, input().split()))
mf.add_edge(d * 2 + 3, e * 2 + 2, INF)
print(s - mf.max_flow(0, 1))
if __name__ == '__main__':
solve()
しらっ亭