Algorithm/그래프

Prim's MST algorithm

jhg0406 2020. 1. 31. 13:23
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
44
45
46
//프림 알고리즘의 구현
 
const int MAX_V = 100;
const int INF = 987654321;
//정점의 개수
int V;
//그래프의 인접 리스트, (연결된 정점 번호, 간선 가중치) 쌍을 담는다
vector<pair<intint>> adj[MAX_V];
//주어진 그래프에 대해 최소 스패닝 트리에 포함된 간선의 목록을 selected에
//저장하고, 가중치의 합을 반환한다.
int prim(vector<pair<intint>>& selected)
{
    selected.clear();
    //해당 점정이 트리에 포함되어 있나?
    vector<bool> added(V, false);
    //트리에 인접한 간선 중 해당 정점에 닿는 최소 간선의 정보를 저장한다.
    vector<int> minWeight(V, INF), parent(V, -1);
    //가중치의 합을 저장할 변수
    int ret = 0;
    //0번 정점을 시작점으로 : 항상 트리에 가장 먼저 추가됨
    minWeight[0= parent[0= 0;
    for(int iter = 0; iter < V; ++iter)
    {
        //다음 트리에 추가할 정점 u를 찾는다
        int u = -1;
        for(int v = 0; v < V; ++v)
            if(!added[v] && (u == -1 || minWeight[u] > minWeight[v]))
                u = v;
        //(parent[u], u)를 트리에 추가한다
        if(parent[u] != u)
            selected.push_back(make_pair(parent[u], u));
        ret += minWeight[u];
        added[u] = true;
        //u에 인접한 간선 (u, v)들을 검사한다
        for(int i = 0; i<adj[u].size(); ++i)
        {
            int v = adj[u][i].first, cost = adj[u][i].second;
            if(minWeight[v] > cost)
            {
                minWeight[v] = cost;
                parent[v] = u;
            }
        }
    }
    return ret;
}
cs

 

 

 

 

 

Prim's MST

하나의 시작점으로 구성된 트리에 간선을 하나씩 추가하며 스패닝 트리가 될 때까지 키워 냅니다.

 

 

 

 

시간복잡도

O(|V|^2 + |E|)

 

 

 

 

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