728x90
https://www.acmicpc.net/problem/4386
4386번: 별자리 만들기
도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일
www.acmicpc.net
Kruskal 알고리즘을 사용하였다.
n개의 노드들을 최단 비용으로 이어버리면 된다.
각 노드에서 각 노드를 향하는 거리를 계산하여
우선수위큐에 넣어 주어 진행하였다.
#include <iostream>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
int n;
pair<double, double> coord[100];
int parent[100];
typedef struct {
int u, v;
double cost;
}node;
struct comp {
bool operator()(node a, node b) {
return a.cost > b.cost;
}
};
void init_parent() {
for (int i = 0; i < n; i++) {
parent[i] = i;
}
}
int FIND(int x) {
if (parent[x] == x)
return parent[x];
return parent[x] = FIND(parent[x]);
}
void UNION(int x, int y) {
x = FIND(x);
y = FIND(y);
if (x > y)
parent[x] = y;
else
parent[y] = x;
}
double kruskal(priority_queue<node, vector<node>, comp> pq ) {
init_parent();
int edge = 0;
double result = 0;
while (edge < n - 1) {
node e = pq.top();
pq.pop();
int u = FIND(e.u);
int v = FIND(e.v);
if (u != v) {
UNION(u, v);
edge++;
result += e.cost;
}
}
return result;
}
int main(void) {
cin >> n;
priority_queue<node, vector<node>, comp> pq;
for (int i = 0; i < n; i++) {
cin >> coord[i].first >> coord[i].second;
}
for (int i = 0; i < n; i++) {
pair<double, double> a = coord[i];
for(int j = i + 1; j < n; j++) {
pair<double, double> b = coord[j];
double dist = sqrt(pow(a.first - b.first, 2) + pow(a.second - b.second, 2));
pq.push({ i,j,dist });
}
}
cout << fixed;
cout.precision(2);
cout << kruskal(pq);
}
728x90
'문제 > 백준' 카테고리의 다른 글
c++ 백준_12852_"1로 만들기 2" (0) | 2023.06.09 |
---|---|
c++ 백준_1987_"알파벳" (0) | 2023.06.09 |
c++ 백준_1806_"부분합" (0) | 2023.06.09 |
c++ 백준_1007_"벡터 매칭" (0) | 2023.06.09 |
c++ 백준_2166_"다각형의 면적" (0) | 2023.06.09 |