結果
問題 |
No.1069 電柱 / Pole (Hard)
|
ユーザー |
![]() |
提出日時 | 2025-06-12 16:39:18 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,839 bytes |
コンパイル時間 | 771 ms |
コンパイル使用メモリ | 82,944 KB |
実行使用メモリ | 430,000 KB |
最終ジャッジ日時 | 2025-06-12 16:39:24 |
合計ジャッジ時間 | 4,975 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 4 |
other | TLE * 1 -- * 78 |
ソースコード
import heapq def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) M = int(data[idx+1]) K = int(data[idx+2]) idx +=3 X = int(data[idx]) -1 Y = int(data[idx+1]) -1 idx +=2 vertices = [] for _ in range(N): p = int(data[idx]) q = int(data[idx+1]) vertices.append((p, q)) idx +=2 edges = [[] for _ in range(N)] for _ in range(M): P = int(data[idx])-1 Q = int(data[idx+1])-1 idx +=2 x1, y1 = vertices[P] x2, y2 = vertices[Q] length = ((x1 - x2)**2 + (y1 - y2)**2) ** 0.5 edges[P].append((Q, length)) edges[Q].append((P, length)) # Compute dist_to_Y using Dijkstra dist_to_Y = [float('inf')] * N dist_to_Y[Y] = 0.0 heap = [] heapq.heappush(heap, (0.0, Y)) while heap: d, u = heapq.heappop(heap) if d > dist_to_Y[u]: continue for v, w in edges[u]: if dist_to_Y[v] > d + w: dist_to_Y[v] = d + w heapq.heappush(heap, (dist_to_Y[v], v)) # Now, find the K smallest simple paths from X to Y results = [] heap = [] initial_visited = frozenset([X]) heapq.heappush(heap, (0.0, X, initial_visited)) while heap: current_length, current_vertex, visited = heapq.heappop(heap) if current_vertex == Y: if len(results) < K: results.append(current_length) results.sort() else: if current_length < results[-1]: results.append(current_length) results.sort() if len(results) > K: results.pop() if len(results) >= K and current_length >= results[K-1]: break continue if len(results) >= K: lower_bound = current_length + dist_to_Y[current_vertex] if lower_bound >= results[K-1]: continue for neighbor, length in edges[current_vertex]: if neighbor not in visited: new_length = current_length + length if len(results) >= K: lower = new_length + dist_to_Y[neighbor] if lower >= results[K-1]: continue new_visited = set(visited) new_visited.add(neighbor) new_visited_frozen = frozenset(new_visited) heapq.heappush(heap, (new_length, neighbor, new_visited_frozen)) # Prepare the output results.sort() for i in range(K): if i < len(results): print("{0:.6f}".format(results[i])) else: print(-1) print() if __name__ == "__main__": main()