MST 에 관하여

2025. 3. 18. 22:23·algorithm

최소 신장 트리(MST, Minimum Spanning Tree)는 그래프 내의 모든 정점을 연결하는 최소 비용의 간선 집합으로 이루어진 트리를 의미합니다. 즉, 그래프의 모든 노드를 최소 비용으로 연결하는 것입니다.


1. MST의 특징

  • 모든 정점이 연결되어 있어야 합니다.
  • 사이클을 포함해서는 안 됩니다.
  • 최소한의 비용으로 구성됩니다.

2. MST 알고리즘 종류

최소 신장 트리를 구하는 대표적인 알고리즘은 다음과 같습니다.

2-1. 크루스칼(Kruskal) 알고리즘

  • 시간 복잡도: O(ElogE)
  • 간선의 비용을 기준으로 오름차순으로 정렬한 후, 사이클을 형성하지 않도록 최소 비용 간선을 순차적으로 선택합니다.

2-2. 프림(Prim) 알고리즘

  • 시간 복잡도: O(ElogV)
  • 시작 정점에서부터 시작하여 연결된 정점들 중 최소 비용의 간선을 선택하여 확장하는 방식입니다.

3. 크루스칼 알고리즘 구현(Java)

import java.util.*;

class Edge implements Comparable<Edge> {
    int src, dest, weight;

    Edge(int src, int dest, int weight) {
        this.src = src;
        this.dest = dest;
        this.weight = weight;
    }

    public int compareTo(Edge compareEdge) {
        return this.weight - compareEdge.weight;
    }
}

class DisjointSet {
    int[] parent;

    DisjointSet(int n) {
        parent = new int[n];
        for (int i = 0; i < n; i++) parent[i] = i;
    }

    int find(int x) {
        if (parent[x] == x) return x;
        return parent[x] = find(parent[x]);
    }

    void union(int x, int y) {
        int xRoot = find(x);
        int yRoot = find(y);
        parent[yRoot] = xRoot;
    }
}

public class KruskalMST {
    static List<Edge> kruskalMST(List<Edge> edges, int V) {
        Collections.sort(edges);
        DisjointSet ds = new DisjointSet(V);

        List<Edge> result = new ArrayList<>();
        int e = 0;

        for (Edge edge : edges) {
            int x = ds.find(edge.src);
            int y = ds.find(edge.dest);

            if (x != y) {
                result.add(edge);
                ds.union(x, y);
                e++;
                if (e == V - 1) break;
            }
        }
        return result;
    }
}
public class Main {
    public static void main(String[] args) {
        int V = 4;
        List<Edge> edges = new ArrayList<>();

        edges.add(new Edge(0, 1, 10));
        edges.add(new Edge(0, 2, 6));
        edges.add(new Edge(0, 3, 5));
        edges.add(new Edge(1, 3, 15));
        edges.add(new Edge(2, 3, 4));

        List<Edge> result = KruskalMST.kruskalMST(edges, V);

        int minimumCost = 0;
        for (Edge edge : result) {
            System.out.println(edge.src + " - " + edge.dest + ": " + edge.weight);
            minimumCost += edge.weight;
        }

        System.out.println("최소 비용: " + minimumCost);
    }
}

4. 마무리

최소 신장 트리 알고리즘은 최소 비용으로 모든 노드를 연결하는 효율적인 방법으로, 다양한 현실 문제 해결에 널리 활용됩니다. 다음과 같은 분야에서 활용됩니다.

  • 네트워크 설계 및 구축
  • 전력 공급망 최적화
  • 도시 계획 및 도로망 구축

'algorithm' 카테고리의 다른 글

LCA 에 관하여  (0) 2025.03.17
세그먼트 트리에 관하여  (0) 2025.03.12
트라이(Trie) 알고리즘에 관하여  (0) 2025.03.08
이분 탐색 + 휴리스틱 기법에 관하여  (0) 2025.02.26
랜덤 액세스 링크드 리스트에 관하여  (0) 2025.02.25
'algorithm' 카테고리의 다른 글
  • LCA 에 관하여
  • 세그먼트 트리에 관하여
  • 트라이(Trie) 알고리즘에 관하여
  • 이분 탐색 + 휴리스틱 기법에 관하여
heejunp
heejunp
희준개발
  • heejunp
    희준개발
    heejunp
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • java (16)
      • spring (1)
        • test (0)
      • web (1)
      • cloud (1)
      • database (2)
      • algorithm (7)
      • OS (2)
      • sonarqube (0)
      • ai (1)
      • 기타 (2)
      • 사고 (1)
      • go (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    heejunp
    MST 에 관하여
    상단으로

    티스토리툴바