結果
問題 | No.3013 ハチマキ買い星人 |
ユーザー |
|
提出日時 | 2025-02-04 09:20:07 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,749 ms / 2,000 ms |
コード長 | 2,204 bytes |
コンパイル時間 | 327 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 172,192 KB |
最終ジャッジ日時 | 2025-02-04 09:20:51 |
合計ジャッジ時間 | 36,830 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 45 |
ソースコード
import heapqfrom collections import defaultdictINF = pow(10, 20) # 無限大とする値。距離や頂点数から考えて十分大きい値にすることN, M,p,y = map(int, input().split()) # N:頂点数 M:入力辺数edge = [set() for _ in range(N + 1)] # edge[i]:頂点iから出ている辺for i in range(M):A, B, C = map(int, input().split()) # A:出発元頂点番号 B:行先頂点番号 C:重みedge[A].add((B, C)) # (同一頂点に向かう辺は1本であることが問題文で保証されていない場合は、最短辺のみが残るように工夫すること)edge[B].add((A, C)) # 無向グラフなので逆側にも入れるdist = [INF for _ in range(N + 1)] # 始点から当該頂点までの最短距離。各頂点に対し無限大で初期化。dist[1] = 0 # 始点から始点の距離なので当然0prev_node = [-1 for _ in range(N + 1)] # 始点から当該頂点までの最短距離時の直前頂点。各頂点に対し、prev(v)←無し。これを辿れば最短経路が求まるhq = [(0, 1)] # 優先度付きキューに(始点からの距離,始点の頂点番号)を追加# ↑何を優先して探索させるかを十分に検討して、入れる要素の順番を決めること。間違えるとTLEする!!!heapq.heapify(hq)while len(hq) != 0:d, u = heapq.heappop(hq) # 優先度付きキューから始点に近い側から頂点を取り出しif dist[u] == d: # (Q(v)←altではなく、更新毎に追加しているので、不要パターンがある。最短の場合のみ処理)for v, C in edge[u]: # 取り出した頂点から出ている全ての辺に対してnew_d = d + C # 新規の距離を計算しif dist[v] > new_d: # 短くなっていたら更新dist[v] = new_dprev_node[v] = uheapq.heappush(hq, (new_d, v)) # 更新したところの接続点は短くなる可能性があるので再調査D=defaultdict(int)for _ in range(p):d,e=map(int,input().split())D[d]=eans=0for i in range(1,N+1):if dist[i]!=INF and D[i]!=0:ans=max(ans,(y-dist[i])//D[i])print(ans)