#include <iostream>
#include <vector>
#include <queue>
 
int V = 0;
int E = 0;
int K = 0;
std::vector<std::pair<int, int>> vec[20001] = {};
int visit[20001] = {};
 
void Dijkstra(int iStart)
{
	std::priority_queue<std::pair<int, int>, 
		std::vector<std::pair<int,int>>, 
		std::greater<std::pair<int,int>>> pri_que = {};
 
	pri_que.push({ 0, iStart });
 
	while (!pri_que.empty())
	{
		int iCost = pri_que.top().first;
		int iNow = pri_que.top().second;
		pri_que.pop();
 
		for (int i = 0; i < vec[iNow].size(); ++i)
		{
			int iNext = vec[iNow][i].first;
			int iNextCost = vec[iNow][i].second;
 
			if (visit[iNext] > iNextCost + iCost)
			{
				visit[iNext] = iNextCost + iCost;
				pri_que.push({visit[iNext], iNext});
			}
		}
	}
}
 
int main() 
{
	std::cin >> V >> E >> K;
 
	for (int i = 0; i < 20001; ++i)
	{
		visit[i] = 200001;
	}
 
	for (int i = 0; i < E; ++i)
	{
		int iFirst = 0;
		int iSecond = 0;
		int iThird = 0;
 
		std::cin >> iFirst >> iSecond >> iThird;
 
		vec[iFirst].push_back({iSecond, iThird});
	}
 
	visit[K] = 0;
 
	Dijkstra(K);
 
	for (int i = 1; i <= V; ++i)
	{
		if (visit[i] != 200001)
		{
			std::cout << visit[i] << "\n";
		}
 
		else
		{
			std::cout << "INF\n";
		}
	}
 
	return 0;
}

이번에도 다익스트라자 문제입니다.

그래도 조금 풀어봤다고 바로 다익스트라자로 풀려고 했는데 우선순위큐 없이 재귀함수로 하려고 했더니 시간초과...

순위 상관없이 길어도 들어가게 되서 그렇습니다.

얼른 우선순위큐(역순)를 만들어주고~ 종료했습니다.

'오늘의 알고리즘' 카테고리의 다른 글

[C++] 백준 1916 최소비용 구하기  (0) 2022.10.05
[C++] 백준 1865 웜홀  (0) 2022.10.05
[C++] 백준 1629 곱셈  (0) 2022.10.02
[C++] 백준 1504 특정한 최단 경로  (0) 2022.10.02
[C++] 백준 1167 트리의 지름  (1) 2022.10.01

+ Recent posts