1197번 - 최소 스패닝 트리
이전 문제에서 MST 를 multimap 을 이용해서 풀었고,
이번 문제에서는 MST 를 우선 순위 큐를 이용해서 문제를 풀었다.
우선 순위 큐는 큰 수 부터 나오기 때문에, -1을 곱해서 작은 수 부터 나오게 해서 정답을 구했다.
<정답 코드>
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include<iostream> #include<vector> #include<queue> #include<algorithm> int p[10001]; int r[10001]; using namespace std; int find(int x) { if (p[x] == x) { return x; } else { return p[x] = find(p[x]); } } void merge(int x, int y) { x = find(x); y = find(y); if (x == y) { return; } if (r[x] < r[y]) { p[x] = y; } else if (r[x] == r[y]) { p[y] = x; r[x]++; } else { p[y] = x; } return; } int main() { //freopen("input.txt", "r", stdin); int n, m; scanf("%d%d", &n, &m); priority_queue<pair<int,pair<int,int>>> q; while (m--) { int a, b, c; scanf("%d%d%d", &a, &b, &c); q.push({ -c,{a,b } }); } for (int i = 1; i <= n; i++) { p[i] = i; r[i] = 1; } long long ans = 0; int cnt = 0; while (!q.empty()) { long long w = -q.top().first; int x = q.top().second.first; int y = q.top().second.second; q.pop(); if (find(x) == find(y)) { continue; } merge(x, y); ans += (-w); cnt++; if (cnt == n - 1) { break; } } printf("%lld\n", -ans); return 0; } | cs |
반응형