최단경로 [다익스트라], 최소신장 트리[크루스칼, 프림] + union/find 정리
start 노드에서 end노드까지 가는데 걸리는 가장 짧은 경로
예시
A > C > B > E
1+2+4 = 7
첫 정점을 기준으로 연결되어 있는 정점들을 추가하며 최단거리를 갱신하는 방법
- BFS 와 유사, 큐/힙 사용
시간복잡도 : O(ElogE)
모든 노드가 연결되어 있으면서 사이클이 존재하지 않는 신장 트리 중 간선의 가중치 합이 가장 짧은 트리
예시
3+2+3+2+3 = 13
개인적으로는 프림알고리즘이 더 이해하기도 구현하기도 쉬웠다.
코드
# 파이썬
parent = { n:n for i in range(1, n+1) }
def get_parent(parent, node):
return node if parent[node] == node else get_parent(parent, parent[node])
def find(parent, a, b):
return get_parent(a, node) == get_parent(b, node)
def union(parent, a, b):
a, b = get_parent(a, node), get_parent(b, node)
if a < b:
parent[b] = a
else:
parent[a] = b
def union_find(parent, a, b):
a, b = get_parent(a, node), get_parent(b, node)
if a != b:
if a < b:
parent[b] = a
else:
parent[a] = b
https://www.fun-coding.org/Chapter20-shortest-live.html
https://www.fun-coding.org/Chapter20-kruskal-live.html
https://www.fun-coding.org/Chapter20-prim-live.html