개인공부용123 프로그래밍 블로그

AlgoSpot) ARCTIC 본문

알고리즘문제

AlgoSpot) ARCTIC

개인공부용123 2017. 2. 3. 22:46

문제 : https://algospot.com/judge/problem/read/ARCTIC


동일한 성능을 가진 무전기로 모든 기지에 연락할떄 무전기 성능을 최소화하는 문제입니다.


이분법과 프림알고리즘 두가지 방법을 이용해서 풀었습니다.


두 기지사이의 거리정보를 미리 계산해서 배열에 넣은후 

이분법에서는 queue를 이용해서 인자로 넣어진값으로 모든 기지에 연락할수있으면 true를 반환하고 아닐시 false를 반환하면서 점점 최적값으로 맞춰갔고

프림알고리즘은 priority_queue를 이용해서 값을 계산했습니다.

100번 반복문을 실행하는이유는 절대오차가 10^-7보다 작게하기위해서입니다.





#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

double dist[101][101];
int N;

double make_dist(double x1, double y1, double x2, double y2) {
	return sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));
}

bool decision(double d) {
	int chk = 0;
	vector visited(N, false);
	queue q;
	q.push(0);
	visited[0] = true;

	while (!q.empty()) {
		int source = q.front();
		q.pop();
		++chk;

		for (int dest = 0; dest < N; ++dest) {
			if (!visited[dest] && dist[source][dest] <= d) {
				q.push(dest);
				visited[dest] = true;
			}
		}
	}

	return (chk == N);
}

double optimize() { // 최적화문제를 결정문제로 바꾸기위해 이분법 이용
	double lo = 0.0, hi = 1500.0;

	for (int i = 0; i < 100; ++i) {
		double mid = (lo + hi) / 2;
		
		if (decision(mid)) hi = mid;
		else lo = mid;
	}

	return lo;
}

double prim() { // prim알고리즘을 이용
	double Max_Range = -1;
	vector visited(N, false);
	priority_queue, vector>, greater>> pq; // min 힙생성

	for (int i = 0; i < N; ++i) pq.push(make_pair(dist[0][i] , i));
	visited[0] = true;
	
	while (!pq.empty()) {
		pair n = pq.top(); pq.pop();
		if (visited[n.second]) continue;
		visited[n.second] = true;
		Max_Range = max(Max_Range, n.first);

		for (int i = 1; i < N; ++i) {
			if (!visited[i]) {
				pq.push(make_pair(dist[n.second][i],i));
			}
		}
	}

	return Max_Range;
}
int main() {
	std::ios::sync_with_stdio(false);
	freopen("test.txt", "r", stdin);

	int C;
	double pos[100][2];
	cin >> C;

	while (C--) {
		memset(dist, 0.0, sizeof(dist));
		memset(pos, 0.0, sizeof(pos));
		cin >> N;
		for (int i = 0; i < N; ++i) {
			cin >> pos[i][0] >> pos[i][1];
		}

		for (int i = 0; i < N; ++i) {
			for (int j = 0; j < N; ++j) {
				//if (dist[i][j] == 0.0) continue;
				dist[i][j] = make_dist(pos[i][0], pos[i][1], pos[j][0], pos[j][1]);
				dist[j][i] = dist[i][j];
			}
		}

		cout << fixed << setprecision(2);
		//cout << optimize() << endl;
		cout << prim() << endl;
	}

	return 0;
}


'알고리즘문제' 카테고리의 다른 글

AlgoSpot) LOAN  (0) 2017.02.07
AlgoSpot) CANADATRIP  (0) 2017.02.06
AlgoSpot) DARPA  (0) 2017.01.31
AlgoSpot) ALLERGY  (0) 2017.01.22
AlgoSpot) QUADTREE  (1) 2017.01.21