-
Kruskal's MST algorithmAlgorithm/그래프 2020. 1. 30. 17:5312345678910111213141516171819202122232425262728293031323334353637383940414243//크루스칼의 최소 스패닝 트리 알고리즘//트리를 이용해 상호 배제적 집합을 구현한다struct DisjointSet;const int MAX_V = 100;//정점의 개수int V;//그래프의 인접 리스트, (연결된 정점 번호, 간선 가중치) 쌍을 담는다.vector<pair<int, int>> adj[MAX_V];//주어진 그래프에 대해 최소 스패닝 트리에 포함된 간선의 목록을 selected에//저장하고, 가중치의 합을 반환한다.int kruskal(vector<pair<int, int>>& selected){int ret = 0;selected.clear();//(가중치, (정점1, 정점2))의 목록을 얻는다.vector<pair<int, pair<int, int>>> 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 Union-Find 알고리즘을 이용해 MST를 구하는 알고리즘
가중치가 적은 간선 순서대로 선택해 싸이클이 생기지 않을 경우 추가
O(|E|lg|E|)
프로그래밍 대회에서 배우는 알고리즘 문제해결전략2
'Algorithm > 그래프' 카테고리의 다른 글
Ford-Fulkerson algorithm (0) 2020.02.10 Prim's MST algorithm (0) 2020.01.31 Floyd-Warshall algorithm (0) 2020.01.23 Bellman-Ford algorithm (0) 2020.01.20 tarjan's SCC algorithm (0) 2020.01.20