/
ALDS1_12_C_Single_Source_Shortest_Path_II.cpp
75 lines (61 loc) · 1.51 KB
/
ALDS1_12_C_Single_Source_Shortest_Path_II.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// ALDS1_12_C Single Source Shortest Path II
// https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_12_C
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
static const int MAX = 10000;
static const int INFTY = (1<<21);
static const int WHITE = 0;
static const int GRAY = 1;
static const int BLACK = 2;
int n;
vector<pair<int, int> > adj[MAX]; // 인접 리스트를 사용한 가중치 방향 그래프 표현
void dijkstra() {
priority_queue<pair<int, int> > PQ;
int color[MAX];
int d[MAX];
for (int i = 0; i < n; i++) {
d[i] = INFTY;
color[i] = WHITE;
}
d[0] = 0;
PQ.push(make_pair(0, 0));
color[0] = GRAY;
while (!PQ.empty()) {
pair<int, int> f = PQ.top();
PQ.pop();
int u = f.second;
color[u] = BLACK;
// 최솟값을 추출하고, 최단 거리가 아니라면 무시
if (d[u] < f.first * (-1))
continue;
for (int j = 0; j < adj[u].size(); j++) {
int v = adj[u][j].first;
if (color[v] == BLACK)
continue;
if (d[v] > d[u] + adj[u][j].second) {
d[v] = d[u] + adj[u][j].second;
// priority_queue는 기본적으로 크기 값을 우선하므로 -1을 곱함
PQ.push(make_pair(d[v] * (-1), v));
color[v] = GRAY;
}
}
}
for (int i = 0; i < n; i++) {
cout << i << " " << (d[i] == INFTY ? -1 : d[i]) << endl;
}
}
int main(void) {
int k, u, v, c;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> u >> k;
for (int j = 0; j < k; j++) {
cin >> v >> c;
adj[u].push_back(make_pair(v, c));
}
}
dijkstra();
return 0;
}