[Algorithm] 프림(Prim)
그래프의 최소 비용 문제
-
최소 신장 트리(MST, Minimum Spanning Tree) 구하기
- 크루스칼(Kruskal) 알고리즘
: 간선이 적고 노드가 많을 때 유리하다.
- 프림(Prim) 알고리즘
: 간선이 많을 때 유리하다.
-
최단 경로 구하기
- 다익스트라(Dijkstra) 알고리즘
프림(Prim) 알고리즘
그리디(Greedy) 알고리즘 사용
특징
최소 신장 트리(MST, Minimum Spanning Tree) 구하기
- 크루스칼(Kruskal) 알고리즘
: 간선이 적고 노드가 많을 때 유리하다. - 프림(Prim) 알고리즘
: 간선이 많을 때 유리하다.
최단 경로 구하기
- 다익스트라(Dijkstra) 알고리즘
그리디(Greedy) 알고리즘 사용
특징
서로소인 2개의 집합 정보를 유지한다. 즉, 트리 정점들(MST를 만들기 위해 선택된 정점들)과 비트리 정점들(선택되지 않은 정점들) 집합이 있다.
방법
선택된 노드 집합에서 선택되지 않은 노드와 연결되는 간선 중에 하나씩 선택하면서 MST를 만들어 가는 방식
- 임의의 정점을 하나 선택한다.
- 선택한 정점을 선택된 노드 집합에 추가한다.
- 선택된 정점에 연결된 간선들 중 선택되지 않은 노드와 연결되고, 그 중에서 가장 작은 가중치를 가진 간선과 연결된 다음 정점을 선택한다.
- 모든 정점이 선택될 때까지 2~3 과정을 반복한다.
코드
def Prim(graph):
visited = [] # 정점(index)이 신장 트리에 포함되었는지 여부 저장
min_costs = [] # 다른 정점에서 해당 정점(index)로 올 수 있는 최소 비용
mst_cost = 0 # 최소신장트리 비용
min_costs[start_node] = 0 # 임의의 시작점의 간선 비용을 0으로 세팅
# 4. 모든 정점이 선택될 때까지 반복한다.
for _ in graph:
# 1. 신장트리에 포함되지 않은 정점 중 최소간선비용의 정점을 찾는다.
for node in graph:
if not visited[node] and min_cost > min_costs[node]:
min_cost = min_costs[node]
min_node = node
# 2. 찾은 정점을 선택된 정점 집합(신장 트리)에 추가한다(포함시킨다).
visited[min_node] = true;
mst_cost = mst_cost + min_cost
# 3. 선택된 정점 기준으로 신장트리에 연결되지 않은 타 정점과의 간선 비용을 최소로 업데이트한다.
for node, cost in graph[min_node]:
if not visited[node] and cost < min_costs[node]:
min_costs[node] = cost
return mst_cost
Author And Source
이 문제에 관하여([Algorithm] 프림(Prim)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hengzizng/Algorithm-Prim저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)