1
1
// Authored by : scsc3204
2
2
// Co-authored by : -
3
- // http://boj.kr/04d9d3317bb448f5b4de000f54bded50
3
+ // http://boj.kr/8d181bd675584722a8beffeb4f4d5476
4
4
#include < bits/stdc++.h>
5
5
using namespace std ;
6
6
using ll = long long ;
@@ -32,15 +32,15 @@ int main() {
32
32
pq.push ({0 , 1 });
33
33
dist[1 ] = 0 ;
34
34
while (!pq.empty ()) {
35
- auto [cd, u ] = pq.top (); pq.pop ();
36
- if (dist[u ] != cd) continue ;
37
- for (auto [rmd, v ] : adj[u ]) {
35
+ auto [cd, cur ] = pq.top (); pq.pop ();
36
+ if (dist[cur ] != cd) continue ;
37
+ for (auto [rmd, nxt ] : adj[cur ]) {
38
38
ll nd = (rmd - cd) % MOD;
39
39
if (nd < 0 ) nd += MOD;
40
40
nd += cd + 1 ;
41
- if (nd >= dist[v ]) continue ;
42
- dist[v ] = nd;
43
- pq.push ({nd, v });
41
+ if (nd >= dist[nxt ]) continue ;
42
+ dist[nxt ] = nd;
43
+ pq.push ({nd, nxt });
44
44
}
45
45
}
46
46
cout << dist[n];
@@ -51,8 +51,8 @@ dist를 초기화할 값을 결정하기 위해 가장 긴 최단거리를 고
51
51
dist를 초기화할 때 활용하는 INF 값을 77'777'777'777으로 설정하였다(8번째 줄).
52
52
그리고 이에 따라 dist는 long long으로 선언하였다.
53
53
54
- 정점 1에서 u까지 가는 확정된 최단 거리를 cd라 하자.
55
- 횡단보도가 켜지는 때가 rmd인 정점으로 건너갈 수 있게 되는
54
+ 정점 1에서 cur까지 가는 확정된 최단 거리를 cd라 하자.
55
+ 횡단보도가 켜지는 때가 rmd인 정점 nxt로 건너갈 수 있게 되는
56
56
가장 빠른 시점을 구해야 한다.
57
57
58
58
기다려야 하는 최소 시간을 x라고 하자.
@@ -61,12 +61,11 @@ x ≡ rmd - cd (mod MOD)이며,
61
61
x는 (rmd - cd) % MOD로 나머지를 구할 수 있다.
62
62
만약 이 값이 음수인 경우엔 MOD를 더하여 구할 수 있다(38-39번째 줄).
63
63
64
- 이 기다려야 하는 최소 시간 후에 1분 후 다음 정점에 도달할 수 있기 때문에,
65
- nd는 위에서 구한 x에 (cd + 1)을 하여 구할 수 있다.
66
- 위 풀이에서는 x를 nd에 저장했으므로, 이를 40번째 줄과 같이 구했다.
67
-
68
- 만약 이렇게 구한 nd가 dist[v]보다 크거나 같다면 이 계산한 값을 무시하고,
69
- nd가 정점 1에서 v로 가는 새로운 최단거리라면 우선순위 큐에 넣는다(41-43번째 줄).
64
+ 이 기다려야 하는 최소 시간 후에 출발하여 1분 후 정점 nxt에 도달할 수 있으므로,
65
+ 정점 1에서 nxt로 가는 거리인 nd는 위에서 구한 x에 (cd + 1)을 더해 구할 수 있다.
66
+ 위 풀이에서는 x를 nd에 저장했으므로, nd += cd + 1;로 구했다(40번째 줄).
70
67
68
+ 만약 이렇게 구한 nd가 dist[nxt]보다 크거나 같다면 이 계산한 값을 무시하고,
69
+ nd가 정점 1에서 nxt로 가는 새로운 최단거리라면 우선순위 큐에 넣는다(41-43번째 줄).
71
70
이 과정을 우선순위 큐가 빌 때까지 반복하고, dist[n]을 출력한다.
72
71
*/
0 commit comments