도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다.
별들이 2차원 평면 위에 놓여 있다. 선을 하나 이을 때마다 두 별 사이의 거리만큼의 비용이 든다고 할 때, 별자리를 만드는 최소 비용을 구하시오.
첫째 줄에 정답을 출력한다. 절대/상대 오차는 10^-2까지 허용한다.
최소 신장 트리
문제union
한다.d = sqrt(x^2 + y^2)
를 해야하는데 d = sqrt(abs(x) + abs(y))
를 했다.int
로 선언한 걸 double
로 바꾸어주었다.#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int parent[101];
vector<pair<double, double> > point;
vector<pair<double, pair<int, int> > > graph;
double getDistance(int x1, int y1, int x2, int y2) {
return sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2));
}
int findParent(int x) {
if(x == parent[x]) return x;
else return findParent(parent[x]);
}
void unionParent(int a, int b) {
a = findParent(a);
b = findParent(b);
if(a < b) parent[b] = a;
else parent[a] = b;
}
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin>>n;
for (int i = 0; i < n; i++){
double x, y;
cin>>x>>y;
point.push_back(make_pair(x, y));
}
for (int i = 0; i < n; i++){
parent[i] = i;
}
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
graph.push_back(make_pair(getDistance(point[i].first, point[i].second, point[j].first, point[j].second), make_pair(i, j)));
}
}
sort(graph.begin(), graph.end());
double answer = 0;
for (int i = 0; i < graph.size(); i++) {
int a, b;
double distance;
distance = graph[i].first;
a = graph[i].second.first;
b = graph[i].second.second;
if(findParent(a) != findParent(b)) {
answer += distance;
unionParent(a, b);
}
}
cout<<answer;
}