다익스트라 알고리즘과 역추적을 하는 문제이다.
다익스트라에서의 역추적은 비교적 단순하다.
우선순위큐 사용시 -를 넣어주는 것을 잊지 말자!
#include <stdio.h>
#include <queue>
#include <vector>
using namespace std;
int n, m, src, dst;
const int MAX = 1000 + 1;
const long long INF = 10000000000;
priority_queue<pair<long long, int>> pq;
vector<pair<long long, int>> v[MAX];
long long dist[MAX];
bool chk[MAX];
int path[MAX];
int main(void)
{
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
v[a].push_back(make_pair(c, b));
}
scanf("%d%d", &src, &dst);
for (int i = 1; i <= n; i++)
{
dist[i] = INF;
path[i] = i;
}
dist[src] = 0;
pq.push({0, src});
while (!pq.empty())
{
int curNode = pq.top().second;
pq.pop();
if (chk[curNode])
continue;
chk[curNode] = true;
for (auto a : v[curNode])
{
if (dist[a.second] > dist[curNode] + a.first)
{
dist[a.second] = dist[curNode] + a.first;
pq.push(make_pair(-dist[a.second], a.second));
path[a.second] = curNode;
}
}
}
printf("%lld\n", dist[dst]);
vector<int> answer;
int x = dst;
while (x != path[x])
{
answer.push_back(x);
x = path[x];
}
answer.push_back(x);
int sze = answer.size();
printf("%d\n", sze);
for (int i = sze - 1; i > -1; i--)
{
printf("%d ", answer[i]);
}
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1072] 게임 (0) | 2021.06.20 |
---|---|
[백준 1948] 임계경로 (0) | 2021.06.19 |
[백준 11780]플로이드2 (0) | 2021.04.11 |
[백준 20056] 마법사 상어와 파이어볼 (0) | 2021.03.31 |
[백준 15662] 톱니바퀴2 (0) | 2021.03.01 |
댓글