본문 바로가기
문제/백준

c++ 백준_4386_"별자리 만들기"

by 나 진짜 못차마 2023. 6. 9.
728x90

https://www.acmicpc.net/problem/4386

 

4386번: 별자리 만들기

도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일

www.acmicpc.net

Kruskal 알고리즘을 사용하였다.

n개의 노드들을 최단 비용으로 이어버리면 된다.

각 노드에서 각 노드를 향하는 거리를 계산하여

우선수위큐에 넣어 주어 진행하였다.

#include <iostream>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;

int n;
pair<double, double> coord[100];
int parent[100];

typedef struct {
	int u, v;
	double cost;
}node;


struct comp {
	bool operator()(node a, node b) {
		return a.cost > b.cost;
	}
};

void init_parent() {
	for (int i = 0; i < n; i++) {
		parent[i] = i;
	}
}

int FIND(int x) {
	if (parent[x] == x)
		return parent[x];
	return parent[x] = FIND(parent[x]);
}

void UNION(int x, int y) {
	x = FIND(x);
	y = FIND(y);
	if (x > y)
		parent[x] = y;
	else
		parent[y] = x;
}

double kruskal(priority_queue<node, vector<node>, comp> pq ) {

	init_parent();

	int edge = 0;

	double result = 0;

	while (edge < n - 1) {
		node e = pq.top();
		pq.pop();

		int u = FIND(e.u);
		int v = FIND(e.v);
		
		if (u != v) {
			UNION(u, v);
			edge++;
			result += e.cost;
		}
	}

	return result;
}



int main(void) {

	cin >> n;

	priority_queue<node, vector<node>, comp> pq;
	
	for (int i = 0; i < n; i++) {
		cin >> coord[i].first >> coord[i].second;
	}

	for (int i = 0; i < n; i++) {
		pair<double, double> a = coord[i];
		for(int j = i + 1; j < n; j++) {
			pair<double, double> b =  coord[j];

			double dist = sqrt(pow(a.first - b.first, 2) + pow(a.second - b.second, 2));
			pq.push({ i,j,dist });
			
		}
	}


	cout << fixed;
	cout.precision(2);
	cout << kruskal(pq);

}

 

728x90

'문제 > 백준' 카테고리의 다른 글

c++ 백준_12852_"1로 만들기 2"  (0) 2023.06.09
c++ 백준_1987_"알파벳"  (0) 2023.06.09
c++ 백준_1806_"부분합"  (0) 2023.06.09
c++ 백준_1007_"벡터 매칭"  (0) 2023.06.09
c++ 백준_2166_"다각형의 면적"  (0) 2023.06.09