結果
問題 |
No.3013 ハチマキ買い星人
|
ユーザー |
|
提出日時 | 2025-01-30 20:25:17 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 911 ms / 2,000 ms |
コード長 | 3,754 bytes |
コンパイル時間 | 348 ms |
コンパイル使用メモリ | 82,148 KB |
実行使用メモリ | 143,212 KB |
最終ジャッジ日時 | 2025-01-30 20:25:43 |
合計ジャッジ時間 | 20,196 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 45 |
ソースコード
import sys import math import bisect from heapq import heapify, heappop, heappush from collections import deque, defaultdict, Counter from functools import lru_cache from itertools import accumulate, combinations, permutations, product sys.set_int_max_str_digits(10 ** 6) sys.setrecursionlimit(1000000) MOD = 10 ** 9 + 7 MOD99 = 998244353 input = lambda: sys.stdin.readline().strip() NI = lambda: int(input()) NMI = lambda: map(int, input().split()) NLI = lambda: list(NMI()) SI = lambda: input() SMI = lambda: input().split() SLI = lambda: list(SMI()) EI = lambda m: [NLI() for _ in range(m)] class Dijkstra(): """ ダイクストラ法 重み付きグラフにおける単一始点最短路アルゴリズム * 使用条件 - 負のコストがないこと - 有向グラフ、無向グラフともにOK * 計算量はO(E*log(V)) * ベルマンフォード法より高速なので、負のコストがないならばこちらを使うとよい """ class Edge(): """ 重み付き有向辺 """ def __init__(self, _to, _cost): self.to = _to self.cost = _cost def __init__(self, V): """ 重み付き有向辺 無向辺を表現したいときは、_fromと_toを逆にした有向辺を加えればよい Args: V(int): 頂点の数 """ self.G = [[] for i in range(V)] # 隣接リストG[u][i] := 頂点uのi個目の隣接辺 self._E = 0 # 辺の数 self._V = V # 頂点の数 @property def E(self): """ 辺数 無向グラフのときは、辺数は有向グラフの倍になる """ return self._E @property def V(self): """ 頂点数 """ return self._V def add(self, _from, _to, _cost): """ 2頂点と、辺のコストを追加する """ self.G[_from].append(self.Edge(_to, _cost)) self._E += 1 def shortest_path(self, s): """ 始点sから頂点iまでの最短路を格納したリストを返す Args: s(int): 始点s Returns: d(list): d[i] := 始点sから頂点iまでの最短コストを格納したリスト。 到達不可の場合、値はfloat("inf") """ import heapq que = [] # プライオリティキュー(ヒープ木) d = [float("inf")] * self.V d[s] = 0 heapq.heappush(que, (0, s)) # 始点の(最短距離, 頂点番号)をヒープに追加する while len(que) != 0: cost, v = heapq.heappop(que) # キューに格納されている最短経路の候補がdの距離よりも大きければ、他の経路で最短経路が存在するので、処理をスキップ if d[v] < cost: continue for i in range(len(self.G[v])): # 頂点vに隣接する各頂点に関して、頂点vを経由した場合の距離を計算し、今までの距離(d)よりも小さければ更新する e = self.G[v][i] # vのi個目の隣接辺e if d[e.to] > d[v] + e.cost: d[e.to] = d[v] + e.cost # dの更新 heapq.heappush(que, (d[e.to], e.to)) # キューに新たな最短経路の候補(最短距離, 頂点番号)の情報をpush return d def main(): N, M, P, Y = NMI() G = Dijkstra(N) for i in range(M): a, b, c = NMI() G.add(a-1, b-1, c) G.add(b-1, a-1, c) D = G.shortest_path(0) # print(D) ans = 0 for _ in range(P): d, e = NMI() ans = max(ans, max((Y-D[d-1]), 0)//e) print(ans) if __name__ == "__main__": main()