8000 Merge pull request #471 from neppiness/24042 · dkim-coder/basic-algo-lecture@874a055 · GitHub
[go: up one dir, main page]

Skip to content

Commit 874a055

Browse files
Merge pull request encrypted-def#471 from neppiness/24042
update: 0x1D 24042.cpp
2 parents cbab2c6 + 7d0ef23 commit 874a055

File tree

1 file changed

+65
-5
lines changed

1 file changed

+65
-5
lines changed

0x1D/solutions/24042.cpp

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,71 @@
1-
// Authored by : BaaaaaaaaaaarkingDog
1+
// Authored by : scsc3204
22
// Co-authored by : -
3-
// http://boj.kr/****************
3+
// http://boj.kr/8d181bd675584722a8beffeb4f4d5476
44
#include <bits/stdc++.h>
55
using namespace std;
6+
using ll = long long;
67

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() {
819
ios::sync_with_stdio(0);
920
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

Comments
 (0)
0