문제
아이디어: 최소 비용으로 그래프를 완성하는 전형적인 MST 문제이다. Kruskal 알고리즘을 사용하였다.
여기서 중요한 점은 간선 정보를 입력받은 후, 간선의 비용은 직접 abs와 min으로 직접 구해야한다는 것이다.
풀이:
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int parent[100000];
int findParent(int x)
{
return (parent[x] == x ? x : parent[x] = 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()
{
// N(행성 개수)
int N;
cin>>N;
// {행성 번호, {x, y, z 좌표}}
vector<pair<int, tuple<int, int, int>>> q;
// {cost, {node1, node2}}
vector<pair<int, pair<int, int>>> v;
for(int i = 0;i < N;i++)
{
int x, y, z;
cin>>x>>y>>z;
q.push_back({i, {x, y, z}});
}
for(int i = 0;i < q.size();i++)
{
int num = q[i].first;
int x = get<0>(q[i].second);
int y = get<1>(q[i].second);
int z = get<2>(q[i].second);
for(int j = i + 1;j < q.size();j++)
{
int num2 = q[j].first;
int x2 = get<0>(q[j].second);
int y2 = get<1>(q[j].second);
int z2 = get<2>(q[j].second);
v.push_back({min(abs(x2 - x), min(abs(y2 - y), abs(z2 - z))), {num, num2}});
}
}
for(int i = 0;i < N;i++)
parent[i] = i;
sort(v.begin(), v.end());
int result = 0;
for(int i = 0;i < v.size();i++)
{
int cost = v[i].first;
int a = v[i].second.first;
int b = v[i].second.second;
if (findParent(a) != findParent(b))
{
unionParent(a, b);
result += cost;
}
}
cout<<result<<endl;
return 0;
}
'ALGORITHM > c&c++ baekjoon' 카테고리의 다른 글
[C++/3665] 최종 순위 - using 위상 정렬 (topology sort) (0) | 2022.05.14 |
---|---|
[C++/7576] 토마토 - using BFS (0) | 2022.05.11 |
[C++/16234] 인구 이동 - using BFS (0) | 2022.05.06 |
[C++/3190] 뱀 - Implementation (0) | 2022.05.06 |
[C++/18405] 경쟁적 전염 - using BFS (0) | 2022.05.06 |