(취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지점에서 출발했다는 것, 그리고 목적지 후보들 중 하나가 그들의 목적지라는 것이다. 그들이 급한 상황이기 때문에 목적지까지 우회하지 않고 최단거리로 갈 것이라 확신한다. 이상이다. (취익)
어휴! (요란한 옷차림을 했을지도 모를) 듀오가 어디에도 보이지 않는다. 다행히도 당신은 후각이 개만큼 뛰어나다. 이 후각으로 그들이 g와 h 교차로 사이에 있는 도로를 지나갔다는 것을 알아냈다.
이 듀오는 대체 어디로 가고 있는 것일까?
예제 입력의 두 번째 케이스를 시각화한 것이다. 이 듀오는 회색 원에서 두 검은 원 중 하나로 가고 있고 점선으로 표시된 도로에서 냄새를 맡았다. 따라서 그들은 6으로 향하고 있다.
Input | Output |
---|---|
2 5 4 2 1 2 3 1 2 6 2 3 2 3 4 4 3 5 3 5 4 6 9 2 2 3 1 1 2 1 1 3 3 2 4 4 2 5 5 3 4 3 3 2 4 5 4 4 6 3 5 6 7 5 6 | 4 5 6 |
# 코드
import heapq
import sys
def dijkstra(graph, n, start):
heap = [(0, start)]
d = [sys.maxsize] * (1+n)
d[start] = 0
while heap:
cost, vertex = heapq.heappop(heap)
for v_, c_ in graph[vertex].items():
new_cost = c_ + cost
if new_cost < d[v_]:
d[v_] = new_cost
heapq.heappush(heap, (new_cost, v_))
return d
t = int(input())
for _ in range(t):
n, m, t = map(int, input().split(' '))
s, g, h = map(int, input().split(' '))
matrix = {i : {} for i in range(1, n+1)}
candidates = []
answer = []
for i in range(m):
a, b, d = map(int, input().split(' '))
matrix[a][b] = d
matrix[b][a] = d
for i in range(t):
x = int(input())
candidates.append(x)
s_ = dijkstra(matrix, n, s)
g_ = dijkstra(matrix, n, g)
h_ = dijkstra(matrix, n, h)
for c in candidates:
if (s_[c] == s_[g] + g_[h] + h_[c]) or (s_[c] == s_[h] + h_[g] + g_[c]):
answer.append(c)
answer.sort()
print(' '.join(map(str, answer)))