結果
問題 | No.654 Air E869120 |
ユーザー |
![]() |
提出日時 | 2019-07-20 20:28:27 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
RE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 3,782 bytes |
コンパイル時間 | 490 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 12,032 KB |
最終ジャッジ日時 | 2024-12-30 09:14:39 |
合計ジャッジ時間 | 4,504 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | RE * 5 |
other | RE * 35 |
ソースコード
import bisectimport heapqimport itertoolsimport mathimport osimport reimport stringimport sysfrom collections import Counter, deque, defaultdictfrom copy import deepcopyfrom decimal import Decimalfrom fractions import gcdfrom functools import lru_cache, reducefrom operator import itemgetterimport numpy as npif os.getenv("LOCAL"):sys.stdin = open("_in.txt", "r")sys.setrecursionlimit(2147483647)INF = float("inf")IINF = 10 ** 18MOD = 10 ** 9 + 7N, M, D = list(map(int, sys.stdin.readline().split()))UVPQW = [list(map(int, sys.stdin.readline().split())) for _ in range(M)]class Dinic:def __init__(self, graph=None, residual=None):""":param list of (list of (int, int)) graph: (to, cap) の隣接リスト:param list of (list of (list of (int|list))) residual: (to, cap, rev) の残余グラフ"""assert (graph and not residual) or (not graph and residual)if graph:self.graph = self.residual_graph(graph)else:self.graph = residual@staticmethoddef residual_graph(graph):"""残余グラフ構築:param list of (list of (int, int)) graph: (to, cap) の隣接リスト:rtype: list of (list of (list of (int|list))):return: (to, cap, rev) の残余グラフ"""ret = defaultdict(list)for v in graph.keys():for u, cap in graph[v]:rev = [v, 0]edge = [u, cap, rev]rev.append(edge)ret[v].append(edge)ret[u].append(rev)return retdef _dist(self, s):""":param int s::rtype: list of int:return: s からの距離。残余グラフ上で到達できない場合は -1"""ret = defaultdict(lambda: -1)ret[s] = 0que = deque([(s, 0)])while que:v, d = que.popleft()for u, cap, _ in self.graph[v]:if ret[u] < 0 < cap:ret[u] = d + 1que.append((u, d + 1))return retdef _dfs(self, s, t, dist, iter, flow=float('inf')):""":param int s::param int t::param list of int dist::param list of int iter::param int flow:"""if s == t:return flowwhile iter[s] < len(self.graph[s]):edge = self.graph[s][iter[s]]to, cap, rev = edgeif dist[s] < dist[to] and cap > 0:f = self._dfs(to, t, dist, iter, min(flow, cap))if f > 0:edge[1] -= frev[1] += freturn fiter[s] += 1return 0def maximum_flow(self, from_v, to_v):""":param int from_v::param int to_v::return: from_v から to_v への最大流"""ret = 0while True:dist = self._dist(from_v)if dist[to_v] < 0:breakiter = defaultdict(int)while True:flow = self._dfs(from_v, to_v, dist, iter)if flow == 0:breakret += flowreturn retcounts = [0] * (N + 1)counts[1] = IINF# 時刻をグラフにするnodes = defaultdict(set)graph = defaultdict(list)for u, v, p, q, w in UVPQW:nodes[u].add(p)nodes[v].add(q + D)graph[(u, p)].append(((v, q + D), w))nodes[1].add(0)nodes[N].add(IINF)for v, ps in nodes.items():ps = list(ps)ps.sort()for p, q in zip(ps[:-1], ps[1:]):graph[(v, p)].append(((v, q), IINF))print(Dinic(graph).maximum_flow((1, 0), (N, IINF)))