8000 Merge pull request #417 from neppiness/1162 · REDICALED/basic-algo-lecture@e25091c · GitHub
[go: up one dir, main page]

Skip to content

Commit e25091c

Browse files
Merge pull request encrypted-def#417 from neppiness/1162
update: 0x1D 1162.cpp
2 parents 66d70c0 + bf8db78 commit e25091c

File tree

1 file changed

+65
-5
lines changed

1 file changed

+65
-5
lines changed

0x1D/solutions/1162.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/0abf612fc1d544f496f3b7952a8d18fa
44
#include <bits/stdc++.h>
55
using namespace std;
6+
using ll = long long;
67

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

Comments
 (0)
0