풀이
다익스트라를 쓰면 된다!
대신 trace(=trc)배열을 만들어서 노드 i가 어디서 왔는지 저장해주고,
나중에 역으로 따라서 출력하면 된다.
코드
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int n_ = 1e3 + 3;
const int INF = 1e9;
struct edg {
int idx, dst;
edg(int idx, int dst) : idx(idx), dst(dst) {}
bool operator <(edg A)const { return dst > A.dst; }
};
int n, m, trc[n_], dst[n_];
vector<int> ans;
vector<edg> gph[n_];
int main() {
int i, u, v, c, s, e;
scanf("%d %d", &n, &m);
for (i = 0; i < m; i++) {
scanf("%d %d %d", &u, &v, &c);
gph[u].push_back(edg(v, c));
}
scanf("%d %d", &s, &e);
for (i = 1; i <= n; i++) dst[i] = INF;
dst[s] = 0;
priority_queue<edg> pq;
pq.push(edg(s, dst[s]));
while (!pq.empty()) {
edg now = pq.top();
pq.pop();
if (now.idx == e) break;
if (now.dst != dst[now.idx]) continue;
for (auto nxt : gph[now.idx]) {
if (dst[nxt.idx] > now.dst + nxt.dst) {
dst[nxt.idx] = now.dst + nxt.dst;
trc[nxt.idx] = now.idx;
pq.push(edg(nxt.idx, dst[nxt.idx]));
}
}
}
int t = e;
while (t) {
ans.push_back(t);
t = trc[t];
}
printf("%d\n%d\n", dst[e], ans.size());
for (i = ans.size() - 1; i >= 0; i--) printf("%d ", ans[i]);
return 0;
}
아무말
백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge, C, C++, 씨, 씨쁠쁠, JAVA, algorithm, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이