[c++] 크루스칼 알고리즘

크루스칼 알고리즘은 최소 신장 트리를 찾는데 사용되는 그래프 이론 알고리즘 중 하나입니다. 최소 신장 트리는 주어진 가중치가 있는 그래프에서 모든 정점을 포함하면서 사이클을 포함하지 않는 부분 그래프 중에서 가중치의 합이 최소인 것을 말합니다.

알고리즘 동작 방식

  1. 간선의 가중치를 기준으로 오름차순 정렬합니다.
  2. 정렬된 간선 리스트에서 가장 작은 가중치를 가진 간선부터 선택합니다.
  3. 선택한 간선이 사이클을 생성하지 않는 경우에만 해당 간선을 최소 신장 트리의 일부로 추가합니다.
  4. 위 과정을 반복하여 모든 정점이 최소 신장 트리에 속할 때까지 진행합니다.

예시 코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct Edge {
    int src, dest, weight;
};

struct Graph {
    int V, E;
    vector<Edge> edges;
    
    void addEdge(int src, int dest, int weight) {
        edges.push_back({src, dest, weight});
    }
    
    vector<Edge> kruskalMST() {
        vector<Edge> result;
        // TODO: 구현 필요
        return result;
    }
};

int main() {
    Graph graph;
    // TODO: 그래프 초기화 및 간선 추가
    
    vector<Edge> mst = graph.kruskalMST();
    
    // 최소 신장 트리의 간선 출력
    for (Edge edge : mst) {
        cout << edge.src << " - " << edge.dest << " : " << edge.weight << endl;
    }
    
    return 0;
}

참고 자료

  1. 위키백과, “크루스칼 알고리즘”
  2. C언어로 쉽게 풀어쓴 알고리즘, 문병로, 생능출판사, 2017