1
- // Authored by : BaaaaaaaaaaarkingDog
1
+ // Authored by : scsc3204
2
2
// Co-authored by : -
3
- // http://boj.kr/****************
3
+ // http://boj.kr/0abf612fc1d544f496f3b7952a8d18fa
4
4
#include < bits/stdc++.h>
5
5
using namespace std ;
6
+ using ll = long long ;
6
7
7
- int main (void ){
8
+ const int KMX = 20 ;
9
+ const int NMX = 10'000 ;
10
+
11
+ int n, m, k;
12
+ ll dist[KMX + 2 ][NMX + 2 ];
13
+ vector<tuple<ll, int , int >> adj[NMX + 2 ]; // adj[u] = {cost, dk, v}
14
+
15
+ int main () {
8
16
ios::sync_with_stdio (0 );
9
17
cin.tie (0 );
10
-
11
- }
18
+
19
+ memset (dist, 0x3f , sizeof (dist));
20
+
21
+ cin >> n >> m >> k;
22
+ while (m--) {
23
+ int u, v; ll cost;
24
+ cin >> u >> v >> cost;
25
+ adj[u].push_back ({cost, 0 , v});
26
+ adj[v].push_back ({cost, 0 , u});
27
+ adj[u].push_back ({0 , 1 , v});
28
+ adj[v].push_back ({0 , 1 , u});
29
+ }
30
+
31
+ priority_queue< tuple<ll, int , int >,
32
+ vector<tuple<ll, int , int >>,
33
+ greater<tuple<ll, int , int >> > pq; // {cost, ck, v}
34
+
35
+ for (int i = 0 ; i <= k; i++)
36
+ dist[i][1 ] = 0 ;
37
+ pq.push ({0 , 0 , 1 });
38
+
39
+ while (!pq.empty ()) {
40
+ auto [cc, ck, cur] = pq.top (); pq.pop ();
41
+ if (dist[ck][cur] != cc) continue ;
42
+ for (auto [dc, dk, nxt] : adj[cur]) {
43
+ dc += cc;
44
+ dk += ck;
45
+ if (dc >= dist[dk][nxt]) continue ;
46
+ if (dk > k) continue ;
47
+ dist[dk][nxt] = dc;
48
+ pq.push ({dc, dk, nxt});
49
+ }
50
+ }
51
+
52
+ ll ans = 0x3f3f3f3f3f3f3f ;
53
+ for (int i = 0 ; i <= k; i++)
54
+ ans = min (ans, dist[i][n]);
55
+ cout << ans;
56
+ }
57
+ /*
58
+ 도시 수가 10,000이고, 비용이 백만 이하기 때문에 int형 변수 범위를 벗어날 수 있으므로
59
+ 최단 거리는 long long 변수로 선언합니다.
60
+
61
+ 최단 거리 테이블을 포장 횟수에 따라 구분해 기록합니다.
62
+ 이를 위해 간선 정보에는 포장 횟수 증가량(dk)을,
63
+ 힙에는 현재까지 포장한 횟수(ck)를 기록합니다.
64
+
65
+ 간선의 경우 포장을 수행하면 비용이 0이 되기 때문에
66
+ 비용은 0, 포장 횟수 증가량(dk)은 1인 간선이라 기록합니다(27-28번째 줄).
67
+
68
+ 이후 다익스트라 알고리즘을 활용해 최단 거리 테이블을 채웁니다.
69
+ 힙에는 현재까지 포장한 횟수(ck)가 기록되기 때문에, 포장횟수 제한 값(k)을 초과하는 경우
70
+ 해당 간선 정보를 무시하도록 구현합니다(46번째 줄).
71
+ */
0 commit comments