Algorithm/그래프

Kruskal's MST algorithm

jhg0406 2020. 1. 30. 17:53
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//크루스칼의 최소 스패닝 트리 알고리즘
 
//트리를 이용해 상호 배제적 집합을 구현한다
 
struct DisjointSet;
const int MAX_V = 100;
//정점의 개수
int V;
//그래프의 인접 리스트, (연결된 정점 번호, 간선 가중치) 쌍을 담는다.
vector<pair<intint>> adj[MAX_V];
 
//주어진 그래프에 대해 최소 스패닝 트리에 포함된 간선의 목록을 selected에
//저장하고, 가중치의 합을 반환한다.
int kruskal(vector<pair<intint>>& selected)
{
    int ret = 0;
    selected.clear();
    //(가중치, (정점1, 정점2))의 목록을 얻는다.
    vector<pair<intpair<intint>>> edges;
    for(int u = 0; u<V; ++u)
        for(int i = 0; i<adj[u].size(); ++i)
        {
            int v = adj[u][i].first, cost = adj[u][i].second;
            edges.push_back(make_pair(cost, make_pair(u, v)));
        }
    //가중치 순으로 정렬
    sort(edges.begin(), edges.end());
    //처음엔 모든 정점이 서로 분리되어 있다
    DisjointSet sets(V);
    for(int i = 0; i<edges.size(); ++i)
    {
        //간선 (u, v)를 검사한다
        int cost = edges[i].first;
        int u = edges[i].second.first, v = edges[i].second.second;
        //이미 u와 v가 연결되어 있을 경우 무시한다
        if(sets.find(u) == sets.find(v)) continue;
        //이 둘을 합친다.
        sets.merge(u, v);
        selected.push_back(make_pair(u, v));
        ret += cost;
    }
    return ret;
}
cs

 

 

 

 

 

Kruskal's MST

Union-Find 알고리즘을 이용해 MST를 구하는 알고리즘

가중치가 적은 간선 순서대로 선택해 싸이클이 생기지 않을 경우 추가

 

 

 

 

시간복잡도

O(|E|lg|E|)

 

 

 

 

프로그래밍 대회에서 배우는 알고리즘 문제해결전략2