-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Platinum V] Title: 행성 터널, Time: 104 ms, Memory: 15616 KB -BaekjoonHub
- Loading branch information
Showing
2 changed files
with
107 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
# [Platinum V] 행성 터널 - 2887 | ||
|
||
[문제 링크](https://www.acmicpc.net/problem/2887) | ||
|
||
### 성능 요약 | ||
|
||
메모리: 15616 KB, 시간: 104 ms | ||
|
||
### 분류 | ||
|
||
그래프 이론, 최소 스패닝 트리, 정렬 | ||
|
||
### 제출 일자 | ||
|
||
2024년 3월 8일 19:14:02 | ||
|
||
### 문제 설명 | ||
|
||
<p> | ||
때는 2040년, 이민혁은 우주에 자신만의 왕국을 만들었다. 왕국은 N개의 행성으로 이루어져 있다. 민혁이는 이 행성을 효율적으로 지배하기 위해서 행성을 연결하는 터널을 만들려고 한다.</p> | ||
|
||
<p> | ||
행성은 3차원 좌표위의 한 점으로 생각하면 된다. 두 행성 A(x<sub>A</sub>, y<sub>A</sub>, z<sub>A</sub>)와 B(x<sub>B</sub>, y<sub>B</sub>, z<sub>B</sub>)를 터널로 연결할 때 드는 비용은 min(|x<sub>A</sub>-x<sub>B</sub>|, |y<sub>A</sub>-y<sub>B</sub>|, |z<sub>A</sub>-z<sub>B</sub>|)이다.</p> | ||
|
||
<p> | ||
민혁이는 터널을 총 N-1개 건설해서 모든 행성이 서로 연결되게 하려고 한다. 이때, 모든 행성을 터널로 연결하는데 필요한 최소 비용을 구하는 프로그램을 작성하시오.</p> | ||
|
||
### 입력 | ||
|
||
<p> | ||
첫째 줄에 행성의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 다음 N개 줄에는 각 행성의 x, y, z좌표가 주어진다. 좌표는 -10<sup>9</sup>보다 크거나 같고, 10<sup>9</sup>보다 작거나 같은 정수이다. 한 위치에 행성이 두 개 이상 있는 경우는 없다. </p> | ||
|
||
### 출력 | ||
|
||
<p> | ||
첫째 줄에 모든 행성을 터널로 연결하는데 필요한 최소 비용을 출력한다.</p> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
#include <iostream> | ||
#include <algorithm> | ||
#include <vector> | ||
using namespace std; | ||
|
||
int n, result = 0; | ||
vector<pair<int,int>> v[3]; | ||
vector<pair<int, pair<int, int>>> planet; | ||
int parent[100001]; | ||
|
||
int Find(int x) { | ||
if (parent[x] == x) | ||
return x; | ||
return parent[x] = Find(parent[x]); | ||
} | ||
|
||
bool SameParent(int a, int b) { | ||
a = Find(a); | ||
b = Find(b); | ||
if (a != b) | ||
return false; | ||
else | ||
return true; | ||
} | ||
|
||
void Union(int a, int b) | ||
{ | ||
a = Find(a); | ||
b = Find(b); | ||
if (a != b) | ||
parent[a] = b; | ||
} | ||
|
||
int main() | ||
{ | ||
ios_base::sync_with_stdio(0); | ||
cin.tie(0); | ||
//freopen("input.txt", "r", stdin); | ||
|
||
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}); | ||
parent[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()); | ||
|
||
for (int i = 0; i < planet.size(); i++){ | ||
if (!SameParent(planet[i].second.first, planet[i].second.second)){ | ||
result += planet[i].first; | ||
Union(planet[i].second.first, planet[i].second.second); | ||
} | ||
|
||
} | ||
cout << result; | ||
return 0; | ||
} |