다익스트라, 플로이드워셜 알고리즘
다익스트라 알고리즘
특정한 노드에서 출발하여 다른 노드로 가는 최단 경로를 구하는 알고리즘
- 그리디
- 음의 간선 없어야함
최단 경로 테이블을 갱신하는 방식
- 리스트
- 최소
코드
import heapq
N, M = map(int, input().split())
INF = int(1e9)
graph = [[] for _ in range(N + 1)]
distarnce = [INF] *(N + 1)
for _ in range(M):
v, u, cost = map(int, input().split())
graph[v].append((u, cost))
start, end = map(int, input().split())
def dijkstra(start):
que = []
heapq.heappush(que, (0, start)) # cost, node
while que:
cost, node = heapq.heappop(que)
if distarnce[node] < cost:
continue
for v in graph[node]:
new_cost = cost + v[1]
if new_cost < distarnce[v[0]]:
heapq.heappush(que, (new_cost, v[0]))
distarnce[v[0]] = new_cost
dijkstra(start)
플로이드 워셜 알고리즘
모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야하는 경우
- 2차원 리스트에 최단 거리 정보 저장
- 다이나믹 프로그래밍
점화식
\[D_{ab} = min(D_{ab}, D_{ak} + D_{kb})\]코드
INF = int(1e9)
node_cnt = int(input())
edge_cnt = int(input())
graph = [[INF] * (node_cnt + 1) for _ in range(node_cnt + 1) ]
for x in range(1, node_cnt + 1):
for y in range(1, node_cnt + 1):
if x == y:
graph[x][y] = 0
for _ in range(edge_cnt):
vertex, edge, cost = map(int, input().split())
graph[vertex][edge] = cost
for k in range(1, node_cnt + 1):
for x in range(1, node_cnt + 1):
for y in range(1, node_cnt + 1):
graph[x][y] = min(graph[x][y], graph[x][k] + graph[k][y])
for x in range(1, node_cnt + 1):
for y in range(1, node_cnt + 1):
print(graph[x][y], end=' ')
print()
댓글남기기