結果
| 問題 |
No.1069 電柱 / Pole (Hard)
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 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()
gew1fw