반응형
https://programmers.co.kr/learn/courses/30/lessons/42861
본 문제는 n개의 섬 사이에 다리를 건설하는 비용이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만드는 문제다. 최소비용이므로 최소 스패닝 트리를 구현하면 된다. union-find를 사용하여 kruskal algorithm을 구현하여 풀었다.
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 47 48 49 50 51 52 53 54 | #include <string> #include <vector> #include <tuple> #include <algorithm> using namespace std; vector<tuple<int, int, int>> v; int parent[101]; int Rank[101] = { 0 }; bool cmp(tuple<int, int, int> x, tuple<int, int, int> y) { int x1, x2, x3; int y1, y2, y3; tie(x1, x2, x3) = x; tie(y1, y2, y3) = y; return x3 < y3; } int Find(int x) { if (x == parent[x]) return x; else return parent[x] = Find(parent[x]); } void Union(int x, int y) { x = Find(x); y = Find(y); if (x == y) return; if (Rank[x] < Rank[y]) swap(x, y); parent[y] = x; if (Rank[x] == Rank[y]) Rank[x] += 1; } int solution(int n, vector<vector<int>> costs) { int answer = 0; for (int i = 1; i <= n; i++) { parent[i] = i; } for (int i = 0; i < costs.size(); i++) { v.push_back(make_tuple(costs[i][0], costs[i][1], costs[i][2])); } sort(v.begin(), v.end(), cmp); for (int i = 0; i < v.size(); i++) { int x, y, z; tie(x, y, z) = v[i]; x = Find(x); y = Find(y); if (x != y) { Union(x, y); answer += z; } } return answer; } | cs |
반응형
'프로그래머스' 카테고리의 다른 글
[프로그래머스] level 3 - 여행경로, C++ (0) | 2020.03.26 |
---|---|
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT - 자물쇠와 열쇠, C++ (0) | 2020.03.24 |
[프로그래머스] level 3 - 최고의 집합 (0) | 2020.02.09 |
[프로그래머스] level 3 - 기지국 설치 (0) | 2020.02.09 |
[프로그래머스] level 3 - 베스트앨범 (0) | 2020.02.09 |
댓글