득이공간

[백준 C++] 13549 숨바꼭질 3 - 다익스트라 본문

PS/알고리즘 문제풀이

[백준 C++] 13549 숨바꼭질 3 - 다익스트라

쟁득 2024. 1. 31. 14:09
 

13549번: 숨바꼭질 3

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net

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

const int& MaxSize = 100001;
const int& Infinite = INT_MAX;

priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> SearchQueue;
int Times[MaxSize];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, K;
	cin >> N >> K;

	for (int i = 0; i < MaxSize; ++i)
	{
		Times[i] = Infinite;
	}
	Times[N] = 0;

	SearchQueue.emplace(0, N);
	while (!SearchQueue.empty())
	{
		int Current = SearchQueue.top().second;
		int CurrentTime = SearchQueue.top().first;
		SearchQueue.pop();

		if (CurrentTime > Times[Current])
		{
			continue;
		}

		pair<int, int> Neighbors[3];

		Neighbors[0].second = Current - 1;
		Neighbors[1].second = Current + 1;
		Neighbors[2].second = 2 * Current;

		Neighbors[0].first = 1;
		Neighbors[1].first = 1;
		Neighbors[2].first = 0;

		for (int i = 0; i < 3; ++i)
		{
			int Neighbor = Neighbors[i].second;
			if (Neighbor >= MaxSize
				|| Neighbor < 0)
			{
				continue;
			}

			int NewTime = CurrentTime + Neighbors[i].first;
			if (NewTime < Times[Neighbor])
			{
				Times[Neighbor] = NewTime;
				SearchQueue.emplace(NewTime, Neighbor);
			}
		}
	}

	cout << Times[K];
}

인접노드(N - 1, N + 1, 2 * N)로 가는 비용을 그때 그때 체크하고

priority_queue를 사용해서 탐색하도록 구현했습니다.

(다익스트라 알고리즘 사용)