1
- // Authored by : BaaaaaaaaaaarkingDog
1
+ // Authored by : scsc3204
2
2
// Co-authored by : -
3
- // http://boj.kr/****************
3
+ // http://boj.kr/8d181bd675584722a8beffeb4f4d5476
4
4
#include < bits/stdc++.h>
5
5
using namespace std ;
6
+ using ll = long long ;
6
7
7
- int main (void ){
8
+ const ll INF = 77'777'777'777 ;
9
+ const int MX = 100'000 + 2 ;
10
+
11
+ int n, m; ll dist[MX];
12
+ vector<pair<int , int >> adj[MX];
13
+
14
+ priority_queue< pair<ll, int >,
15
+ vector<pair<ll, int >>,
16
+ greater<pair<ll, int >> > pq;
17
+
18
+ int main () {
8
19
ios::sync_with_stdio (0 );
9
20
cin.tie (0 );
10
-
11
- }
21
+
22
+ fill (dist, dist + MX, INF);
23
+
24
+ cin >> n >> m;
25
+ for (int i = 0 ; i < m; i++) {
26
+ int u, v; cin >> u >> v;
27
+ adj[u].push_back ({i, v});
28
+ adj[v].push_back ({i, u});
29
+ }
30
+
31
+ const int MOD = m;
32
+ pq.push ({0 , 1 });
33
+ dist[1 ] = 0 ;
34
+ while (!pq.empty ()) {
35
+ auto [cd, cur] = pq.top (); pq.pop ();
36
+ if (dist[cur] != cd) continue ;
37
+ for (auto [rmd, nxt] : adj[cur]) {
38
+ ll nd = (rmd - cd) % MOD;
39
+ if (nd < 0 ) nd += MOD;
40
+ nd += cd + 1 ;
41
+ if (nd >= dist[nxt]) continue ;
42
+ dist[nxt] = nd;
43
+ pq.push ({nd, nxt});
44
+ }
45
+ }
46
+ cout << dist[n];
47
+ }
48
+ /*
49
+ dist를 초기화할 값을 결정하기 위해 가장 긴 최단거리를 고려하자.
50
+ 최악의 경우 70만 분씩 걸려 10만 개 정점을 건너게 될 수도 있으므로,
51
+ dist를 초기화할 때 활용하는 INF 값을 77'777'777'777으로 설정하였다(8번째 줄).
52
+ 그리고 이에 따라 dist는 long long으로 선언하였다.
53
+
54
+ 정점 1에서 cur까지 가는 확정된 최단 거리를 cd라 하자.
55
+ 횡단보도가 켜지는 때가 rmd인 정점 nxt로 건너갈 수 있게 되는
56
+ 가장 빠른 시점을 구해야 한다.
57
+
58
+ 기다려야 하는 최소 시간을 x라고 하자.
59
+ (cd + x) ≡ rmd (mod MOD)를 만족해야 한다.
60
+ x ≡ rmd - cd (mod MOD)이며,
61
+ x는 (rmd - cd) % MOD로 나머지를 구할 수 있다.
62
+ 만약 이 값이 음수인 경우엔 MOD를 더하여 구할 수 있다(38-39번째 줄).
63
+
64
+ 이 기다려야 하는 최소 시간 후에 출발하여 1분 후 정점 nxt에 도달할 수 있으므로,
65
+ 정점 1에서 nxt로 가는 거리인 nd는 위에서 구한 x에 (cd + 1)을 더해 구할 수 있다.
66
+ 위 풀이에서는 x를 nd에 저장했으므로, nd += cd + 1;로 구했다(40번째 줄).
67
+
68
+ 만약 이렇게 구한 nd가 dist[nxt]보다 크거나 같다면 이 계산한 값을 무시하고,
69
+ nd가 정점 1에서 nxt로 가는 새로운 최단거리라면 우선순위 큐에 넣는다(41-43번째 줄).
70
+ 이 과정을 우선순위 큐가 빌 때까지 반복하고, dist[n]을 출력한다.
71
+ */
0 commit comments