알고리즘/백준(BOJ)
백준 - 11779 최소비용 구하기 2
시나모온
2020. 6. 30. 20:39
문제 링크입니다 : https://www.acmicpc.net/problem/11779
11779번: 최소비용 구하기 2
첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스�
www.acmicpc.net
다익스트라 + 경로탐색 (트리 형태)
#include <iostream>
#include <vector>
#include <queue>
#define INF 987654321
using namespace std;
int n, m;
vector<vector<pair<int, int>>> vertex;
vector<int> dist;
vector<int> parent;
vector<int> path;
int dijkstra(int start, int end) {
// weight, vertex
priority_queue<pair<int, int>> pq;
dist[start] = 0;
pq.push({0, start});
while(!pq.empty()) {
int cur = pq.top().second;
int cdist = -pq.top().first;
pq.pop();
if(cur == end) {
int temp = end;
while(temp != start) {
path.push_back(temp);
temp = parent[temp];
}
path.push_back(temp);
return cdist;
}
for(int i = 0; i < vertex[cur].size(); i++) {
int next = vertex[cur][i].first;
int nextDist = cdist + vertex[cur][i].second;
if(nextDist < dist[next]) {
parent[next] = cur;
dist[next] = nextDist;
pq.push({-nextDist, next});
}
}
}
}
int main() {
cin >> n >> m;
vertex.assign(n + 1, vector<pair<int, int>>());
dist.assign(n + 1, INF);
parent.assign(n + 1, 0);
int u, v, w;
for(int i = 0; i < m; i++) {
cin >> u >> v >> w;
vertex[u].push_back({v, w});
}
int start, end;
cin >> start >> end;
cout << dijkstra(start, end) << '\n';
cout << path.size() << '\n';
for(int i = path.size() - 1; i >= 0; i--) {
cout << path[i] << ' ';
}
return 0;
}
개발 환경 : vscode
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~