💡`양의 가중치 + 단일 시작점 + 최소 거리`는 무조건 다익스트라를 사용해야 하는 조건임!
☁️ 코드 뼈대 세우기
입력 처리
분기점 수 n과 분기점들을 잇는 간선 수 m을 map을 통해 입력받기
적의 시야에 보이는지 여부를 list, map을 사용해 입력받기
감시가 있는 장소는 1, 없는 장소는 0인데 마지막 분기점은 감시가 있어도 지나갈 수 있으니 0으로 설정하기
그래프 생성하기
connect[u] = [(비용, v), (비용, w), ...] 형식의 인접 리스트로 생성하기
양방향이니까 양쪽 다 append 해주기
다익스트라 함수
순서
1. 거리 정보 inf로 초기화 (다익스트라의 기본 개념)
2. 우선순위 큐로 최소 거리 노드부터 처리
3. heapq에서 꺼내진 노드와 연결된 모든 노드 확인하기 (for)
4. 조건문 활용해 방문 가능한지 확인 (더 짧은 경로가 있는지? and 감시가 있어 지나갈 수 없는지)
5. 더짧은 경로가 있고 감시자 없다면 거리 갱신 및 heapq에 삽입
코드
start=0, end=n-1
dis_list[node]: 시작점에서 해당 노드까지의 최소 거리를 저장
heapq(우선순위큐)를 사용해서 자동으로 최소 거리 노드부터 탐색
감시가 있는 곳은 지나갈 수 없으니 arr[next_node]!=1이 아닌 곳만 지나가게 함
☁️ 코드
import sys
import heapq
# 입력
input = sys.stdin.readline
N,M = map(int, input().split())
arr = list(map(int, input().strip().split()))
arr[-1] = 0 # 마지막 분기점
# 최대값
INF = sys.maxsize
# 그래프 만들기
connect = [[] for _ in range(N)]
for i in range(M):
a, b, t = map(int, input().split())
connect[a].append((t, b))
connect[b].append((t, a))
# 다익스트라
def dijkstra(start, end):
dis_list = [INF for _ in range(N)]
dis_list[start] = 0
pq = []
heapq.heappush(pq, (0, start))
while pq:
dis, node = heapq.heappop(pq)
if dis > dis_list[node]: # 이미 더 짧은 경로를 방문한 경우는 skip
continue
for next_cost, next_node in connect[node]: # pop한 노드에서 연결된 노드들 순회하기
if dis_list[next_node] > dis_list[node]+next_cost and not arr[next_node]:
dis_list[next_node] = dis_list[node]+next_cost
heapq.heappush(pq, (dis_list[next_node], next_node))
return dis_list[end]
num = dijkstra(0, N-1)
if num==INF:
print(-1)
else:
print(num)