-
Prim's MST algorithmAlgorithm/그래프 2020. 1. 31. 13:2312345678910111213141516171819202122232425262728293031323334353637383940414243444546//프림 알고리즘의 구현const int MAX_V = 100;const int INF = 987654321;//정점의 개수int V;//그래프의 인접 리스트, (연결된 정점 번호, 간선 가중치) 쌍을 담는다vector<pair<int, int>> adj[MAX_V];//주어진 그래프에 대해 최소 스패닝 트리에 포함된 간선의 목록을 selected에//저장하고, 가중치의 합을 반환한다.int prim(vector<pair<int, int>>& 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 하나의 시작점으로 구성된 트리에 간선을 하나씩 추가하며 스패닝 트리가 될 때까지 키워 냅니다.
O(|V|^2 + |E|)
프로그래밍 대회에서 배우는 알고리즘 문제해결전략2
'Algorithm > 그래프' 카테고리의 다른 글
이분 매칭 문제를 해결하는 증가 경로 알고리즘 (0) 2020.02.23 Ford-Fulkerson algorithm (0) 2020.02.10 Kruskal's MST algorithm (0) 2020.01.30 Floyd-Warshall algorithm (0) 2020.01.23 Bellman-Ford algorithm (0) 2020.01.20