코드 복사/붙여넣기 하는 당신이 아름답습니다.

11779 : 최소비용 구하기 2

풀이

다익스트라를 쓰면 된다!

대신 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, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이

wookje.kwon's profile image

wookje.kwon

2017-04-11 12:55

Read more posts by this author