알고리즘/백준
BOJ 4386. 별자리 만들기
아헿헿헿
2022. 7. 14. 06:06
BOJ 4386. 별자리 만들기
랭크 : 골드4
문제 풀이
먼저 점들에 대해서 서로 계산하여, 간선들을 우선순위 큐에 담고, 이를 prim 알고리즘을 활용하여 풀어냅니다.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
int N;
int parents[101];
struct Point {
float value;
int i, j;
Point(float v, int i, int j) : value(v), i(i), j(j) {};
bool operator<(const Point& ref) const { return this->value > ref.value; };
};
int FindParents(int a) {
if (parents[a] == a) return a;
return parents[a] = FindParents(parents[a]);
};
void isUnion(int a, int b) {
a = FindParents(a);
b = FindParents(b);
if (a == b) return;
if (a < b) {
parents[b] = a;
}
else {
parents[a] = b;
}
}
bool UnionFind(int a, int b) {
a = FindParents(a);
b = FindParents(b);
return (a == b);
}
pair<float, float> num1[101];
priority_queue<Point> pq;
int main() {
fastio;
cin >> N;
for (int i=1; i <= N; i++) {
parents[i] = i;
cin >> num1[i].first >> num1[i].second;
for (int j=1; j < i; j++) {
float tmp = (num1[j].first - num1[i].first) * (num1[j].first - num1[i].first)
+ (num1[j].second - num1[i].second) * (num1[j].second - num1[i].second);
pq.push({tmp, i, j});
}
};
float ans = 0;
while (!pq.empty()) {
Point tmp = pq.top(); pq.pop();
if (!UnionFind(tmp.i, tmp.j)) {
ans += sqrt(tmp.value);
isUnion(tmp.i, tmp.j);
}
}
cout << fixed;
cout.precision(2);
cout << ans << endl;
}
알고리즘 |
시간복잡도 |
공간복잡도 |
---|---|---|
prim, union_find | $O(N^2)$ | $O(N^2)$ |