#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 |