結果
問題 | No.654 Air E869120 |
ユーザー |
![]() |
提出日時 | 2025-03-31 17:42:43 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 149 ms / 2,000 ms |
コード長 | 3,021 bytes |
コンパイル時間 | 270 ms |
コンパイル使用メモリ | 82,220 KB |
実行使用メモリ | 87,184 KB |
最終ジャッジ日時 | 2025-03-31 17:43:41 |
合計ジャッジ時間 | 4,427 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 35 |
ソースコード
import sysfrom collections import dequeclass Edge:def __init__(self, to, rev, cap):self.to = toself.rev = revself.cap = capclass Dinic: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([s])level[:] = [-1]*self.sizelevel[s] = 0while q:v = q.popleft()if v == t:returnfor edge in self.graph[v]:if edge.cap > 0 and level[edge.to] == -1:level[edge.to] = level[v]+1q.append(edge.to)def 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.cap > 0 and level[v] < level[edge.to]:d = self.dfs_flow(edge.to, t, min(upTo, edge.cap), iter_, level)if d > 0:edge.cap -= dself.graph[edge.to][edge.rev].cap += 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():input = sys.stdin.read().split()idx = 0N = int(input[idx]); idx += 1M = int(input[idx]); idx += 1d = int(input[idx]); idx += 1flights = []for _ in range(M):u = int(input[idx]); idx += 1v = int(input[idx]); idx += 1p = int(input[idx]); idx += 1q = int(input[idx]); idx += 1w = int(input[idx]); idx += 1flights.append((u, v, p, q, w))size = 2 * M + 2source = 2 * Msink = 2 * M + 1dinic = Dinic(size)for i in range(M):u, v, p, q, w = flights[i]in_node = 2 * iout_node = 2 * i + 1dinic.add_edge(in_node, out_node, w)if u == 1 and p >= 0:dinic.add_edge(source, in_node, 10**18)if v == N:dinic.add_edge(out_node, sink, 10**18)for i in range(M):_, v_i, _, q_i, _ = flights[i]for j in range(M):u_j, _, p_j, _, _ = flights[j]if i != j and v_i == u_j and (q_i + d) <= p_j:dinic.add_edge(2 * i + 1, 2 * j, 10**18)print(dinic.max_flow(source, sink))if __name__ == '__main__':main()