728x90
다익스트라
- 음수간선 X
- S 시작점부터 다른 모든 노드로 가는 최단거리 구하는 알고리즘
- 기출 : 음수간선이 없는데 시작점이 있고 최단거리 구하는 문제
- 원리
-
- 최단거리를 구할 노드에서 시작하여 거리가 입력된 노드 중 최단거리가 가장 작은 노드를 돌아가며 선택
- 노드를 돌아가면서, 더 거리가 나오면 값 갱신하여 저장
-
우선순위 큐
풀이 (PriorityQueue)
import sys
from queue import PriorityQueue
"""
다익스트라
에지의 가중치가 10 이하의 자연수인 방향 그래프
시작점에서 다른 모든 노드의 최단경로
노드의 개수 v(1~20,000), 에지의 개수 e(1~300,000)
출발번호 k
에지 정보 u v w (u에서 v로가는 가중치 w)
두 노드 사이에 에지가 2개이상 존재할 수 있음
시작점은 0, 경로가 없을 경우 INF 출력
"""
# 노드, 엣지의 갯수
v, e = map(int, input().split())
# 시작점
k = int(input())
q = PriorityQueue()
# 최단거리 리스트
distance = [sys.maxsize] * (v+1)
# 방문 배열
visited = [False] * (v+1)
# 인접 리스트
graph = [[] for _ in range(v+1)]
for i in range(e):
u, v, w = map(int, input().split()) # 가중치가 있는 인접 리스트 저장
# 인접리스트에 에지 정보 저장
graph[u].append((v,w))
# 출발 노드는 우선순위 큐에 넣고 시작
q.put((0,k)) # k를 시작점으로 설정
# 거리 리스트에 출발 노드의 값을 0으로 설정
distance[k] = 0
while q.qsize() > 0:
# 우선순위 큐에서 노드 가져오기
current = q.get()
c_v = current[1]
# 현재 선택 노드 방문 여부 확인
if visited[c_v]:
continue
# 현재 노드 방문 처리
visited[c_v] = True
for tmp in graph[c_v]:
next = tmp[0]
value = tmp[1]
# 연결 노드의 최단거리 > 연결 노드 방문전 and 현재 노드 최단 거리 + 비용
if distance[next] > distance[c_v] + value:
# 연결 노드 최단 거리 업데이트
distance[next] = distance[c_v] + value
# 우선 순위 큐에 연결 노드 추가
q.put((distance[next], next))
for i in range(1,v+1):
if visited[i]:
print(distance[i])
else:
print("INF")
풀이(heapq)
from heapq import heappush, heappop
import sys
input = sys.stdin.readline
INF = int(1e9) # 무한을 의미하는 값으로 10억을 설정
# 노드의 개수, 간선의 개수 입력
n, m = map(int, input().split())
# 시작 노드 번호를 입력받기
start = int(input())
# 각 노드에 연결된 노드에 대한 정보를 담는 리스트 생성
graph = [[] for i in range(n+1)]
# 최단 거리 테이블을 모두 무한으로 초기화
distance = [INF] * (n+1)
# 모든 간선 정보를 입력받기
for _ in range(m):
a,b,c = map(int, input().split())
graph[a].append((b, c))
q = []
# 시작 노드로 가기 위한 최단 경로는 0으로 설정하여, 큐에 삽입
heappush(q, (0, start))
distance[start] = 0
while q: # 큐가 비어있지 않다면
# 최단 거리가 가장 짧은 노드에 대한 정보 꺼내기
dist, now = heappop(q)
# 현재 노드가 이미 처리된 적이 있는 노드라면 무시
if distance[now] < dist:
continue
# 현재 노드와 연결된 다른 인접한 노드들을 확인
for i in graph[now]:
cost = dist + i[1]
# 현재 노드를 거쳐서, 다른 노드로 이동하는 거리가 더 짧은 경우
if cost < distance[i[0]]:
distance[i[0]] = cost
heappush(q, (cost, i[0]))
# 모든 노드로 가기 위한 최단 거리를 출력
for i in range(1, n+1):
# 도달할 수 없는 경우, 무한(INFINITY)이라고 출력
if distance[i] == INF:
print("INFINITY")
# 도달할 수 있는 경우, 거리를 출력
else:
print(distance[i])
728x90