๐๏ธ ๊ฒช์ ๋ฌธ์
- ๋ค์ต์คํธ๋ผ๋ก ํ์๋๋ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
- priority_queue์ ๊ธฐ๋ณธ๊ฐ์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ธ ๊ฒ์ ๋ง๊ฐํ๋ค.
๐ priority_queue ์ ์ธ ๋ฐฉ๋ฒ
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
- ์ธ์ ์ค๋ช
- T : ์ ๋ ฌํ ์์์ ํ์
, ํ์ ์ ์ฅํ ํ์
- Container :๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ ์ง๋ฅผ ๋ํ๋ด๋ ์ปจํ
์ด๋ ํ์
- Compare :์์๋ฅผ ์ ๋ ฌํ ๊ธฐ์ค์ด ๋๋ ํจ์ ๊ฐ์ฒด(ํจ์ ํฌ์ธํฐ ๋๋ functor)
- less<T>: ํฐ ๊ฐ์ ๋จผ์ ๊บผ๋ → Max Heap (๊ธฐ๋ณธ๊ฐ)
- greater<T>: ์์ ๊ฐ์ ๋จผ์ ๊บผ๋ → Min Heap
- ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ๋ฉด ๋ด๋ฆผ์ฐจ์์ด ๋๋ค.
- priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
๐ ์ฝ๋
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int INF = 1e7;
int V, E, K; // ์ ์ ์ (1~), ๊ฐ์ ๊ฐ์, ์์ ์ ์ ๋ฒํธ
void dajikstra(vector<vector<pair<int, int>>> &graph, vector<int> &dist) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq; // ์ ์ , ๋์ ๊ฑฐ๋ฆฌ
pq.push({0, K});
dist[K] = 0;
while (!pq.empty()) {
auto [sumDir, node] = pq.top();
pq.pop();
for (const auto &[next, dir] : graph[node]) {
if (dist[next] == INF || dist[next] > sumDir + dir) {
dist[next] = sumDir + dir;
pq.push({sumDir + dir, next});
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> V >> E >> K;
vector<vector<pair<int, int>>> graph(V+1);
vector<int> dist(V+1, INF);
// vector<pair<int, int>> graph[E];
for (int i=0; i<E; i++) {
int u, v, w;
// u -> v, ๊ฐ์ค์น w
cin >> u >> v >> w;
graph[u].push_back({v, w});
}
// ๊ฐ ์ ์ ๊น์ง ์ต๋จ๊ฒฝ๋ก ์ ์ฅ ์์์ ์ 0
dajikstra(graph, dist);
for (int i=1; i<=V; i++) {
if (dist[i] == INF) {
cout << "INF" << '\n';
}
else {
cout << dist[i] << '\n';
}
}
return 0;
}