結果
問題 | No.654 Air E869120 |
ユーザー | りん |
提出日時 | 2023-07-09 17:02:29 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 208 ms / 2,000 ms |
コード長 | 3,572 bytes |
コンパイル時間 | 484 ms |
コンパイル使用メモリ | 82,400 KB |
実行使用メモリ | 195,492 KB |
最終ジャッジ日時 | 2024-07-23 14:16:50 |
合計ジャッジ時間 | 5,816 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 45 ms
55,128 KB |
testcase_01 | AC | 41 ms
55,044 KB |
testcase_02 | AC | 42 ms
56,088 KB |
testcase_03 | AC | 41 ms
55,428 KB |
testcase_04 | AC | 42 ms
55,596 KB |
testcase_05 | AC | 41 ms
55,012 KB |
testcase_06 | AC | 46 ms
61,248 KB |
testcase_07 | AC | 41 ms
56,240 KB |
testcase_08 | AC | 41 ms
55,116 KB |
testcase_09 | AC | 43 ms
55,240 KB |
testcase_10 | AC | 171 ms
78,076 KB |
testcase_11 | AC | 157 ms
77,896 KB |
testcase_12 | AC | 159 ms
77,752 KB |
testcase_13 | AC | 171 ms
77,932 KB |
testcase_14 | AC | 146 ms
78,044 KB |
testcase_15 | AC | 141 ms
78,024 KB |
testcase_16 | AC | 189 ms
117,544 KB |
testcase_17 | AC | 185 ms
112,344 KB |
testcase_18 | AC | 188 ms
115,408 KB |
testcase_19 | AC | 180 ms
112,932 KB |
testcase_20 | AC | 135 ms
114,460 KB |
testcase_21 | AC | 149 ms
126,380 KB |
testcase_22 | AC | 104 ms
90,248 KB |
testcase_23 | AC | 118 ms
99,664 KB |
testcase_24 | AC | 150 ms
125,752 KB |
testcase_25 | AC | 97 ms
88,340 KB |
testcase_26 | AC | 110 ms
95,564 KB |
testcase_27 | AC | 94 ms
86,696 KB |
testcase_28 | AC | 117 ms
105,372 KB |
testcase_29 | AC | 95 ms
86,596 KB |
testcase_30 | AC | 203 ms
194,772 KB |
testcase_31 | AC | 207 ms
195,032 KB |
testcase_32 | AC | 203 ms
195,096 KB |
testcase_33 | AC | 183 ms
147,884 KB |
testcase_34 | AC | 208 ms
195,492 KB |
testcase_35 | AC | 43 ms
54,976 KB |
testcase_36 | AC | 42 ms
55,644 KB |
testcase_37 | AC | 44 ms
54,840 KB |
testcase_38 | AC | 43 ms
54,652 KB |
testcase_39 | AC | 44 ms
55,588 KB |
ソースコード
#https://yukicoder.me/problems/no/654 import sys sys.setrecursionlimit(10**7) from collections import deque class Edmond_karp: def __init__(self,V): self.v = V self.edges = [[] for _ in range(V)] #隣接リスト def addEdge(self,fr,to,cap): forward = [to,cap,len(self.edges[to])] #行き先、capasity,逆向きの辺のindex backward = [fr,0,len(self.edges[fr])] #逆向きの辺 self.edges[fr].append(forward) self.edges[to].append(backward) def bfs(self,s,t): #tはdestination,fは追加できる最大のフロー量 q = deque([(s,-1,float('inf'),-1)]) #vertex,parent,flow,rev_idx parent = [-1]*self.v revs = [-1]*self.v self.used[s] = 1 parent[s] = -1 revs[s] = -1 #sからでてる逆向きの辺は存在しないので-1でok aug_flow = 0 #sからtまでの最短距離を計算する while len(q) > 0: v,p,f,rev = q.popleft() if v == t: #終点に達したら aug_flow = f break for e in self.edges[v]: w,cap,rev_idx = e #revは反対の辺の情報 if cap and not self.used[w]: q.append((w,v,min(f,cap),rev_idx)) self.used[w] = 1 parent[w] = v revs[w] = rev_idx #wの逆向きの辺のindex # 最短経路のフロー数だけ遡る if aug_flow: #最大値が0じゃなかったら v,p,rev = t,parent[t],revs[t] while p != -1: rev_e = self.edges[v][rev] #tからのreversed edge e = self.edges[p][rev_e[2]] #vじゃだめ。index入れないと e[1] -= aug_flow rev_e[1] += aug_flow v,p,rev = p,parent[p],revs[p] return aug_flow def flow(self,s,t): flow = 0 f = INF = float('inf') v = self.v while f: #この操作回数はO(VE)らしい。 self.used = [0]*v #used初期化 f = self.bfs(s,t) #計算量はO(E) fordfulkersonと一緒 flow += f return flow N,M,d = map(int,input().split()) #(u,pi)→(v,qi)にcapacityがwiの辺を設定 #(u,pi)→(u,pi+1)には容量無限大の辺を設定(空港で待つことを意味する) #上の方法だと間に合わないから #辺を貼るのは街iに飛行機が到着する時刻だけでいい。 def convert(u,time): return u*maxtime + time_dict[time] INF = float('inf') #dを考慮する。Aに出発しBに到着する飛行機はAに出発し、B+dに到着するとみなすことができる。 events = [] time = set() for _ in range(M): u,v,p,q,w = map(int,input().split()) #このqは1日の終わりを超えることはない。 u -= 1 v -= 1 q += d #(u,p)→(v,q+d)へcapacityがwの辺 events.append((u,v,p,q,w)) time.add(p) time.add(q) time = sorted(list(time)) maxtime = len(time) time_dict = {t:i for i,t in enumerate(time)} ff = Edmond_karp(maxtime*N) wait = [[] for _ in range(N)] for u,v,p,q,w in events: ff.addEdge(convert(u,p),convert(v,q),w) wait[u].append(p) wait[v].append(q) for i in range(N): wait[i].sort() for j in range(len(wait[i])-1): t1 = wait[i][j] t2 = wait[i][j+1] ff.addEdge(convert(i,t1),convert(i,t2),INF) if wait[0] and wait[N-1]: print(ff.flow(convert(0,wait[0][0]),convert(N-1,wait[N-1][-1]))) else: print(0)