1 분 소요

최소 비용 신장 트리 (최소 신장 트리: MST: Minimum Spanning Tree)

  • 그래프의 모든 정점은 연결되어야 합니다
  • 연결에 필요한 간선의 가중치 합(비용)이 최소가 되어야 합니다

  • 최소 비용 신장 트리: 가중치 그래프의 여러 신장 트리 중에서 간선의 가중치 합이 최소인 것

MST의 응용 분야

  • 통신망: 모든 사이트가 연결되도록 하면서 비용을 최소화하는 문제
  • 도로망: 도시들을 모두 연결하면서 도로의 길이가 최소가 되도록 하는 문제
  • 배관 작업: 파이프를 모두 연결하면서 파이프의 길이를 최소화하는 문제
  • 전기 회로: 단자들을 모두 연결하면서 전선의 길이를 최소화하는 문제

MST에 포함되지 않은 최소 dist의 정점 찾기

INF = 999
def getMinVertex(dist, selected):
    minv = 0
    mindist = INF
    for v in range(len(dist)):
        if selected[v] == False and dist[v] < mindist:
            mindist = dist[v]
            minv = v
    return minv     

프림의 최소 신장 트리 알고리즘

def MSTprim(vertex, adj):
    n = len(vertex)
    dist = [INF] * n
    dist[0] = 0
    selected = [False] * n

    for _ in range(n):              # n개의 정점을 MST에 추가하면 종료됨
        u = getMinVertx(dist, selected)
        selected[u] = True
        print(vertex[u], end= ' ')
        for v in range(n):
                                    # 간선 (u, v) 가 있고, v가 MST에 포함안되면
            if adj[u][v] != INF and not selected[v]:
                if adj[u][v] < dist[v]: # (u,v)가 dist[v] 보다 작으면
                    dist[v] = adj[u][v] # dist[v] 갱신

        print(': ', dist)     # 중간 결과 출력
            

실행 결과

A : [0, 25, 999, 12, 999, 999, 999] 
D : [0, 25, 999, 12, 17, 37, 999]
E : [0, 15, 999, 12, 17, 19 ,14]
G : [0, 15, 16, 12, 17, 19, 14]
B : [0, 15, 10, 12, 17, 19, 14]
C : [0, 15, 10, 12, 17, 19, 14]
F : [0, 15, 10, 12, 17, 19, 14]

프림 알고리즘은 얼마나 빠를까?

  • 외부 루프는 정점의 수 $n$만큼 반복
  • 내부에서는 18행의 getMinVertex() 함수에 반복문이 있는데, 역시 $n$번 반복
  • 또한 21행의 내부 루프도 $n$번 반복
  • 따라서 외부와 내부 루프의 반복 횟수의 곱에 비례하는 연산이 필요
  • 시간 복잡도는 $O(n^2)$ 이다

댓글남기기