結果
| 問題 |
No.654 Air E869120
|
| コンテスト | |
| ユーザー |
PNJ
|
| 提出日時 | 2023-11-09 02:17:54 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 414 ms / 2,000 ms |
| コード長 | 2,122 bytes |
| コンパイル時間 | 371 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 142,208 KB |
| 最終ジャッジ日時 | 2024-09-25 23:59:40 |
| 合計ジャッジ時間 | 7,465 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 35 |
ソースコード
from collections import deque
import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline
class Dinic:
def __init__(self,V):
self.V = V
self.E = [[] for i in range(V)]
self.P = [0 for i in range(V)]
def add_edge(self,u,v,cap):
self.E[u].append((v,cap,self.P[v]))
self.E[v].append((u,0,self.P[u]))
self.P[u] += 1
self.P[v] += 1
def flow(self,s,t):
G = self.E
P = self.P
def bfs(s): #始点から各頂点への最短距離をBFSで求める。
dist = [-1 for i in range(self.V)]
dist[s] = 0
Q = deque()
Q.append(s)
while len(Q) > 0:
u = Q.popleft()
for v,cap,rev in G[u]:
if cap > 0 and dist[v] < 0:
dist[v] = dist[u] + 1
Q.append(v)
return dist
def dfs(u,t,f,removed,dist):
if u == t:
return f
while removed[u] < P[u]:
v,cap,rev = G[u][removed[u]]
if cap > 0 and dist[u] < dist[v]:
ff = dfs(v,t,min(f,cap),removed,dist)
if ff > 0:
G[u][removed[u]] = (v,cap-ff,rev)
u,Cap,Rev = G[v][rev]
G[v][rev] = (u,Cap+ff,Rev)
return ff
removed[u] += 1
return 0
f = 0
while True:
dist = bfs(s)
if dist[t] < 0:
return f
removed = [0 for i in range(self.V)]
while True:
ff = dfs(s,t,10000000000,removed,dist)
if ff == 0:
break
f += ff
N,M,d = map(int,input().split())
G = Dinic(2*M+2)
X = [0]
for i in range(M):
u,v,p,q,w = map(int,input().split())
G.add_edge(2*i+1,2*i+2,w)
X.append((u,p,0))
X.append((v,q,1))
inf = 10**18
for i in range(1,2*M+1):
v,t,f = X[i]
if f == 0:
if v == 1:
G.add_edge(0,i,inf)
else:
if v == N:
G.add_edge(i,2*M+1,inf)
for j in range(1,2*M+1):
u,tt,ff = X[j]
if f == 0 and ff == 0:
if u == v:
if t <= tt:
G.add_edge(i,j,inf)
if t >= tt:
G.add_edge(j,i,inf)
if f == 1 and ff == 0:
if t + d <= tt and u == v:
G.add_edge(i,j,inf)
ans = G.flow(0,2*M+1)
print(ans)
PNJ