Logseq/pages/프림 알고리즘 (Prim’s Algorithm).md
2025-12-30 23:16:31 +09:00

2.4 KiB

deck:: Logseq/coding tip

  • 1. 개념(Concept)

    • 최소 스패닝 트리(MST)를 구하는 알고리즘.
    • “임의의 시작 정점에서 출발하여, 현재 트리에 연결된 간선 중 가장 싼 것을 추가하며 확장한다.” 라는 전략을 사용
  • 2. 동작 원리 (Algorithm Flow)

      1. 임의의 정점(vertex)을 하나 선택해서 트리에 포함시킨다.
      1. 현재 트리에 포함된 정점들과 포함되지 않은 정점들을 연결하는 간선 중, 가중치가 가장 작은 간선을 찾는다.
      1. 해당 간선과 연결된 새로운 정점을 트리에 추가한다.
      1. 위의 과정을 반복하여 최종적으로 모든 정점이 트리에 포함될 때 까지 반복한다.
  • 3. 코드(python)

    • 입력이 V(정점의 갯수), 인접리스트(graph)와 시작노드(start_node)를 매개변수로 하여 id:: 695111c8-84a0-4220-a7f4-b9f654761cec 프림 알고리즘으로 최소 스패닝 트리를 구현하고, 이때 총 가중치를 반환하는 함수를 구현하면?
      # graph: (노드: [(비용, 인접노드)]...)
      # ex) graph = [[],[(3,2),(4,5)],[(1,3)]...]
      
      #card
      • import heapq
        
        # graph: 인접 리스트 (노드: [(비용, 인접노드), ...])
        def prim(start_node, v, graph):
            visited = [False] * (v + 1)
            min_heap = [(0, start_node)] # (비용, 정점)
            total_cost = 0
            count = 0
        
            while min_heap:
                cost, node = heapq.heappop(min_heap)
        
                if visited[node]:
                    continue
        
                visited[node] = True
                total_cost += cost
                count += 1
        
                if count == v: # 모든 정점 방문 완료
                    break
        
                # 인접 정점 중 방문 안 한 곳을 큐에 넣기
                for next_cost, next_node in graph[node]:
                    if not visited[next_node]:
                        heapq.heappush(min_heap, (next_cost, next_node))
        
            return total_cost
        
  • 4. 시간복잡도

    • 우선순위큐 연산이 주된 연산이므로 우선순위 큐 연산 속도에 영향을 많이 받음.
    • 시간복잡도는 {{cloze $O(E\log V)$}} id:: 69511407-a9bc-40f2-b57c-f76060ea75f1