간선에 음수가 아닌 가중치가 주어질 때 최단 경로를 찾는 문제이고 O(E log V)의 시간복잡도를 갖는 알고리즘으로 해결할 수 있으므로,
다익스트라 알고리즘을 사용하여 해결할 수 있는 문제임을 알 수 있다.
다익스트라 알고리즘(Dijkstra's algorithm)
다익스트라 알고리즘(Dijkstra's algorithm)은 Weighted graph, 즉 간선에 가중치가 있는 그래프가 주어졌을 때, 하나의 고정된 특정 노드에서 시작해 다른 모든 노드로 가는 최단 경로를 찾는 알고리즘이
jsyeo.tistory.com
따라서 위 링크에서 구현했던 다익스트라 알고리즘을 사용해 문제를 해결하였다.
[ 정답 코드 ]
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
struct Dijkstra {
int s;
vector<vector<pair<int, int>>> adjList;
vector<int> dist;
vector<bool> visited;
void init(vector<vector<pair<int, int>>>& edge, int source) {
s = source;
adjList = edge;
dist.resize(adjList.size());
visited.resize(adjList.size());
for(int i = 0; i < dist.size(); i++) {
if(i == source) {
dist[i] = 0;
} else {
dist[i] = 1<<30; // INF
}
}
}
void dijkstra() {
priority_queue<pair<int, int>> pq;
pq.push({0, s});
while (!pq.empty()) {
int u = pq.top().second; // cur node
pq.pop();
if(visited[u]) continue;
visited[u] = true;
for(auto vw : adjList[u]) {
int v = vw.first;
int w = vw.second;
if(dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
pq.push({-dist[v], v});
}
}
}
}
};
int main() {
iostream::sync_with_stdio(false);
cin.tie(NULL);
int V, E, K;
cin >> V >> E >> K;
vector<vector<pair<int, int>>> adjList(V, vector<pair<int, int>>());
for(int i = 0; i < E; i++) {
int u, v, w;
cin >> u >> v >> w;
adjList[u-1].push_back({v-1, w});
}
Dijkstra dijkstra;
dijkstra.init(adjList, K-1);
dijkstra.dijkstra();
for(int i = 0; i < dijkstra.dist.size(); i++) {
if(dijkstra.dist[i] == 1<<30) {
cout << "INF" << '\n';
} else {
cout << dijkstra.dist[i] << '\n';
}
}
return 0;
}
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[ BOJ - 2042번 ] 구간 합 구하기 (C++) (1) | 2024.01.15 |
---|---|
[ BOJ - 17779번 ] 게리멘더링 2 (C++) (0) | 2024.01.15 |
[ BOJ - 13549번 ] 숨바꼭질 3 (C++) (0) | 2024.01.12 |
[ BOJ - 17142번 ] 연구소 3 (C++) (1) | 2024.01.11 |
[ BOJ - 9376번 ] 탈옥 (C++) (1) | 2024.01.10 |