※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 16398번 문제인 행성 연결이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/16398
16398번: 행성 연결
홍익 제국의 중심은 행성 T이다. 제국의 황제 윤석이는 행성 T에서 제국을 효과적으로 통치하기 위해서, N개의 행성 간에 플로우를 설치하려고 한다. 두 행성 간에 플로우를 설치하면 제국의 함
www.acmicpc.net
주어진 N개의 행성을 노드로, 각 두 행성의 쌍을 해당 행성들 사이에 플로우를 설치했을 때의 유지비용을 가중치로 하는 에지로 생각해 문제의 상황을 그래프로 모델링할 수 있다. 이 때 주어진 문제는 위 그래프의 최소 신장 트리(Minimum spanning tree)의 가중치를 구하는 문제로 생각할 수 있다.
글쓴이는 크루스칼 알고리즘(Kruskal's algoroithm)을 이용해 최소 신장 트리의 가중치를 구해 문제를 해결하였다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int N;
int uf[1001];
int findf(int x) {
if (uf[x] == x) return x;
return uf[x] = findf(uf[x]);
}
ll ans;
priority_queue<pair<int, pair<int, int>>> pq;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 1; i <= N; i++) uf[i] = i;
for (int r = 1; r <= N; r++) {
for (int c = 1; c <= N; c++) {
int x; cin >> x;
if (r < c) pq.push(make_pair(-x, make_pair(r, c)));
}
}
while (!pq.empty()) {
int val = -pq.top().first, x = pq.top().second.first, y = pq.top().second.second; pq.pop();
x = findf(x), y = findf(y);
if (x == y) continue;
ans += val, uf[y] = x;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 24084 // C++] 次の文字 (Next Character) (0) | 2022.12.12 |
---|---|
[BOJ 26042 // C++] 식당 입구 대기 줄 (0) | 2022.12.12 |
[BOJ 2824 // C++] 최대공약수 (0) | 2022.12.11 |
[BOJ 4459 // C++] Always Follow the Rules in Zombieland (0) | 2022.12.11 |
[BOJ 19963 // C++] Санта Клаус (0) | 2022.12.11 |