728x90
반응형
4386번: 별자리 만들기
문제
https://www.acmicpc.net/problem/4386
4386번: 별자리 만들기
도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일
www.acmicpc.net
풀이
각 별의 2차원 좌표가 주어지고 별들을 모두 직/간접적으로 최소한의 거리로 이었을 때 거리를 구하는 문제다. 흔한 MST 문제와 달리 약간 생각을 해야한다. 정점 간 가중치가 주어지는 것이 아니기 때문에 각 정점 간 가중치를 직접 구해줘야 한다. 마침 정점의 수 N도 최대 100이므로 모든 정점 간 거리를 구해 간선으로 삼아 MST의 가중치를 구하면 된다. 자료형에 주의하자.
코드
#include <bits/stdc++.h>
using namespace std;
#define pdd pair<double, double>
int N;
vector<pdd> graph[100];
double prim() {
priority_queue<pdd> pq;
vector<int> visited(N, 0);
visited[0] = 1;
for (pdd edge : graph[0])
pq.push(edge);
double cost = 0;
while (!pq.empty()) {
double weight = -pq.top().first;
int node = pq.top().second;
pq.pop();
if (!visited[node]) {
visited[node] = 1;
cost += weight;
for (pdd next : graph[node])
if (!visited[next.second])
pq.push(next);
}
}
return cost;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
vector<pdd> xy(N); // 좌표 값 저장
for (int i = 0; i < N; i++)
cin >> xy[i].first >> xy[i].second;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
// 2차원 좌표에서 두 점 사이의 거리 공식
double dist = sqrt(pow(xy[i].first - xy[j].first, 2) + pow(xy[i].second - xy[j].second, 2));
// i번 정점과 j번 정점 사이의 잇는 거리를 간선으로 추가
graph[i].push_back({-dist, j});
graph[j].push_back({-dist, i});
}
cout.precision(2);
cout << fixed << prim();
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 16940 BFS 스페셜 (0) | 2023.03.24 |
---|---|
[백준 / BOJ] C++ 10423 전기가 부족해 (0) | 2023.03.23 |
[백준 / BOJ] C++ 11659 구간 합 구하기 4 (0) | 2023.03.23 |
[백준 / BOJ] C++ 16964 DFS 스페셜 (0) | 2023.03.23 |
[백준 / BOJ] C++ 1647 도시 분할 계획 (0) | 2023.03.22 |