반응형
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
// 그냥 함수로 빼도 되지만 묶어서 정리하고 싶어서 class로 만듬
class UF // Union_Find
{
public:
static int FindParent(int parent[], int n)
{
if (parent[n] == n) return n;
return parent[n] = FindParent(parent, parent[n]);
}
static void UnionParent(int parent[], int a, int b)
{
a = FindParent(parent, a);
b = FindParent(parent, b);
if (a < b) parent[b] = a;
else parent[a] = b;
}
static bool GetParent(int parent[], int a, int b)
{
if (FindParent(parent, a) == FindParent(parent, b)) return false;
else return true;
}
};
class Edge // 간선
{
public:
Edge(int a, int b, float d) {
Node[0] = a;
Node[1] = b;
distance = d;
}
bool operator < (Edge& edge)
{
return this->distance < edge.distance;
}
public:
int Node[2];
float distance;
};
int main()
{
vector<Edge> v; // 간선
vector<pair<int, int>> pv; // 별자리 좌표
int parent[101]{ 0 };
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
float a, b;
// 모든 노드는 자기 자신을 가르키는걸로 초기화
parent[i] = i;
cin >> a >> b;
pv.push_back(make_pair(a, b)); // 좌표를 넣음
}
for (int i = 0; i < N - 1; i++)
{
for (int j = i + 1; j < N; j++)
{
float dist = static_cast<float>(
sqrt(pow(pv[j].first - pv[i].first, 2) +
pow(pv[j].second - pv[i].second, 2)));
// 거리 계산후 노드와 거리를 vector에 넣음
v.push_back(Edge(i, j, dist));
}
}
sort(v.begin(), v.end()); // 거리가 짧은 순으로 정렬
float sum = 0;
for (int i = 0; i < v.size(); i++)
{
if (UF::GetParent(parent, v[i].Node[0], v[i].Node[1]))
{
sum += v[i].distance;
UF::UnionParent(parent, v[i].Node[0], v[i].Node[1]);
}// 순환되지 않으면 묶음
}
cout << round(sum * 100) / 100;
return 0;
}
반응형
LIST
'알고리즘 문제 > 백준' 카테고리의 다른 글
[C++] 단어 수학 - 1339 (0) | 2022.12.05 |
---|---|
[C++] 축사 배정 - 2188 (0) | 2022.12.01 |
[C++] 2*n 타일링 2 - 11727 (1) | 2022.11.26 |
[C++] 2*n 타일링 - 11726 (0) | 2022.11.26 |
[C++] 수 정렬하기 2(병합정렬) - 2751 (0) | 2022.11.22 |