[python] 프림 알고리즘

프림 알고리즘은 최소 신장 트리(MST, Minimum Spanning Tree)를 구하는 알고리즘 중 하나입니다. MST는 그래프에서 최소 비용으로 모든 노드를 연결하는 부분 그래프입니다.

프림 알고리즘은 다음과 같은 과정으로 동작합니다:

  1. 임의의 시작 노드를 선택합니다.
  2. 선택한 노드와 연결된 간선 중에서 가장 작은 비용의 간선을 선택합니다.
  3. 선택한 간선의 연결된 노드를 방문할 때마다, 이미 선택된 노드와 연결된 간선 중에서 최소 비용의 간선을 선택합니다.
  4. 모든 노드를 방문할 때까지 2, 3번 과정을 반복합니다.

아래는 프림 알고리즘을 파이썬으로 구현한 예시 코드입니다:

def prim(graph):
    # 그래프의 첫 번째 노드를 시작 노드로 선택
    start_node = list(graph.keys())[0]
    
    # 시작 노드를 방문한 것으로 처리
    visited = set([start_node])
    
    # 선택한 간선들을 저장할 리스트
    edges = []
    
    while len(visited) < len(graph):
        min_edge = None
        min_cost = float('inf')
        
        for node in visited:
            for neighbor, cost in graph[node].items():
                if neighbor not in visited and cost < min_cost:
                    min_edge = (node, neighbor)
                    min_cost = cost
        
        if min_edge:
            edges.append(min_edge)
            visited.add(min_edge[1])
    
    return edges

# 그래프 예시
graph = {
    'A': {'B': 7, 'D': 5},
    'B': {'A': 7, 'C': 8, 'D': 9, 'E': 7},
    'C': {'B': 8, 'E': 5},
    'D': {'A': 5, 'B': 9, 'E': 15, 'F': 6},
    'E': {'B': 7, 'C': 5, 'D': 15, 'F': 8, 'G': 9},
    'F': {'D': 6, 'E': 8, 'G': 11},
    'G': {'E': 9, 'F': 11}
}

# 프림 알고리즘 실행
minimum_spanning_tree = prim(graph)
print(minimum_spanning_tree)

위 예시 코드를 실행하면, 다음과 같은 결과가 출력됩니다:

[('A', 'D'), ('D', 'F'), ('A', 'B'), ('B', 'E'), ('E', 'C'), ('E', 'G')]

프림 알고리즘을 사용하면 그래프에서 최소 비용의 신장 트리를 구하는데 사용할 수 있습니다. 자세한 내용은 다양한 자료와 참조를 통해 공부하시기 바랍니다.