-
최소 스패닝 트리 - 1197Algorithm/BOJ 2020. 1. 30. 19:3712345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970//최소 스패닝 트리 - 1197#include <iostream>#include <vector>#include <algorithm>using namespace std;int V, E;vector<pair<int, pair<int, int>>> edges;struct DisjointSet{vector<int> parent, rank;DisjointSet(int n) : parent(n+1), rank(n+1, 1){for(int i = 1; i<=n; ++i)parent[i] = i;}int find(int u){if(u == parent[u]) return u;return parent[u] = find(parent[u]);}void merge(int u, int v){u = find(u); v = find(v);if(u == v) return;if(rank[u] > rank[v]) swap(u, v);parent[u] = v;if(rank[u] == rank[v]) ++rank[v];}};int kruskal(){int ans = 0;int cost, x, y;DisjointSet sets(V);for(int i =0; i<E; ++i){cost = edges[i].first;x = edges[i].second.first;y = edges[i].second.second;if(sets.find(x) == sets.find(y)) continue;sets.merge(x, y);ans += cost;}return ans;}int main(){cin >> V >> E;edges = vector<pair<int, pair<int, int>>>(E);int x, y, r;for(int i = 0; i<E; ++i){cin >> x >> y >> r;edges[i].first = r;edges[i].second.first = x;edges[i].second.second = y;}sort(edges.begin(), edges.end());cout << kruskal() << "\n";}
cs https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 가중치 C인 간선으로 연결되어 있다는 의미이다. C는 음수일 수도 있으며, 절댓값이 1,000,000을 넘지 않는다. 최소 스패닝 트리의 가중치가 -2147483648보다 크거나 같고, 2147483647보다 작거나 같은 데
www.acmicpc.net
kruskal's MST 알고리즘을 이용해 풀었습니다.
'Algorithm > BOJ' 카테고리의 다른 글
축사 배정 - 2188 (0) 2020.02.11 효율적인 해킹 - 1325 (0) 2020.02.11 최대공약수와 최소공배수 - 2609 (0) 2020.01.20 Strongly Connected Component - 2150 (0) 2020.01.20 단절선 - 11400 (1) 2020.01.10