BOJ 2887. νμ± ν°λ
πββοΈ[Platinum V] νμ± ν°λ - 2887
μ±λ₯ μμ½
λ©λͺ¨λ¦¬: 15660 KB, μκ°: 96 ms
λΆλ₯
κ·Έλν μ΄λ‘ , μ΅μ μ€ν¨λ νΈλ¦¬, μ λ ¬
μ μΆ μΌμ
2024λ 3μ 6μΌ 13:42:12
λ¬Έμ μ€λͺ
λλ 2040λ , μ΄λ―Όνμ μ°μ£Όμ μμ λ§μ μκ΅μ λ§λ€μλ€. μκ΅μ Nκ°μ νμ±μΌλ‘ μ΄λ£¨μ΄μ Έ μλ€. λ―Όνμ΄λ μ΄ νμ±μ ν¨μ¨μ μΌλ‘ μ§λ°°νκΈ° μν΄μ νμ±μ μ°κ²°νλ ν°λμ λ§λ€λ €κ³ νλ€.
νμ±μ 3μ°¨μ μ’νμμ ν μ μΌλ‘ μκ°νλ©΄ λλ€. λ νμ± A(xA, yA, zA)μ B(xB, yB, zB)λ₯Ό ν°λλ‘ μ°κ²°ν λ λλ λΉμ©μ min(|xA-xB|, |yA-yB|, |zA-zB|)μ΄λ€.
λ―Όνμ΄λ ν°λμ μ΄ N-1κ° κ±΄μ€ν΄μ λͺ¨λ νμ±μ΄ μλ‘ μ°κ²°λκ² νλ €κ³ νλ€. μ΄λ, λͺ¨λ νμ±μ ν°λλ‘ μ°κ²°νλλ° νμν μ΅μ λΉμ©μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
첫째 μ€μ νμ±μ κ°μ Nμ΄ μ£Όμ΄μ§λ€. (1 β€ N β€ 100,000) λ€μ Nκ° μ€μλ κ° νμ±μ x, y, zμ’νκ° μ£Όμ΄μ§λ€. μ’νλ -109λ³΄λ€ ν¬κ±°λ κ°κ³ , 109λ³΄λ€ μκ±°λ κ°μ μ μμ΄λ€. ν μμΉμ νμ±μ΄ λ κ° μ΄μ μλ κ²½μ°λ μλ€.
μΆλ ₯
첫째 μ€μ λͺ¨λ νμ±μ ν°λλ‘ μ°κ²°νλλ° νμν μ΅μ λΉμ©μ μΆλ ₯νλ€.
πνμ΄
kruskalμκ³ λ¦¬μ¦μ μ΄μ©ν΄μ λ¬Έμ λ₯Ό νλ €κ³ νλ€.
κ° μ μ μ λΉμ©λ€μ λΉκ΅νλ©΄μ νλ €κ³ νλλ° μ΅λ μ μ μ΄ 10λ§κ°μ¬μ λͺ¨λ μ μ μ μ΄μμμ λ©λͺ¨λ¦¬ μ΄κ³Όκ° λ¬λ€.
λ¬Έμ μ ν΅μ¬μ λͺ¨λ μ μ μ 거리λ₯Ό λΉκ΅νμ§ λ§κ³ κ·Όμ²μ μλ μ μ λ€λ§ λΉκ΅λ₯Ό ν΄μ μ°κ²° μ 보λ₯Ό λ£μ΄μ€μΌνλ€.
πμ 체 μ½λ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
// νμ± ν°λ
// kruskal λ¬Έμ
struct Edge
{
int cost;
int u, v;
bool operator<(Edge& other)
{
return cost < other.cost;
}
};
const int MAX = 111111;
int unf[MAX];
int n;
vector<pair<int, int>> v[3];
vector<Edge> planet;
int Find(int u)
{
if (u == unf[u])
return u;
return unf[u] = Find(unf[u]);
}
void Merge(int u, int v)
{
u = Find(u);
v = Find(v);
if (u == v)
return;
unf[u] = v;
}
void solve()
{
cin >> n;
int x, y, z;
for (int i = 0; i < n; ++i)
{
cin >> x >> y >> z;
v[0].push_back({ x, i });
v[1].push_back({ y, i });
v[2].push_back({ z, i });
unf[i] = i;
}
sort(v[0].begin(), v[0].end());
sort(v[1].begin(), v[1].end());
sort(v[2].begin(), v[2].end());
for (int i = 0; i < n - 1; ++i)
{
planet.push_back({ abs(v[0][i].first - v[0][i + 1].first), v[0][i].second, v[0][i + 1].second});
planet.push_back({ abs(v[1][i].first - v[1][i + 1].first), v[1][i].second, v[1][i + 1].second});
planet.push_back({ abs(v[2][i].first - v[2][i + 1].first), v[2][i].second, v[2][i + 1].second});
}
sort(planet.begin(), planet.end());
int ret = 0;
for (int i = 0; i < planet.size(); ++i)
{
if (Find(planet[i].u) == Find(planet[i].v))
continue;
ret += planet[i].cost;
Merge(planet[i].u, planet[i].v);
}
cout << ret;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}