1. 다익스트라 알고리즘
- 다익스트라 최단 경로 알고리즘: 특정한 노드에서 출발하여 다른 노드로 가는 각각의 최단 경로를 구해주는 알고리즘
- 그리디 알고리즘을 이용한다는게 특징
- 출발노드를 설정한다.
- 최단거리 테이블을 초기화 한다.
- 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택한다.
- 해당 노드를 거쳐 다른 노드로 가는 비용을 계산하여 최단 거리 테이블을 갱신한다.
- 위 과정에서 3, 4번을 반복한다.(모든 노드를 다 방문했을 때 종료함)
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
n, m = map(int, input().split())
start = int(input())
graph = [[] for _ in range(n+1)]
distance = [INF] * (n+1)
for _ in range(m):
a, b, c = map(int, input().split())
graph[a].append((b, c))
def dijkstra(start):
q = []
distance[start] = 0
heapq.heappush(q, (0, start))
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for i in graph[now]:
cost = distance[now] + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
dijkstra(start)
print(distance)
2. 플로이드 워셜 알고리즘
- 플로이드 워셜 알고리즘 : 모든 지점에서 다른 모든 지점가지의 최단 경로를 모두 구하는 경우에 사용하는 알고리즘
- 다이나믹 프로그래밍을 사용한다는 것이 특징
import sys
input = sys.stdin.readline
INF = int(1e9)
n = int(input())
m = int(input())
graph = [[INF] * (n+1) for _ in range(n+1)]
for _ in range(m):
a, b, c = map(int, input().split())
graph[a][b] = c
for i in range(1, n+1):
graph[i][i] = 0
for i in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][i] + graph[i][b])
for i in graph:
print(i)