๐ค๋ฌธ์ ์ดํด
1๋ฒ ์ ์ ์์ N๋ฒ ์ ์ ๊น์ง ๊ฐ๋ ๋ชจ๋ ๊ฒฝ๋ก ์ค์ ์ต๋ k๊ฐ์ ๋๋ก ์ด๋ ์๊ฐ์ด 0์ด ๋์์ ๋ ์๊ฐ์ด ๊ฐ์ฅ ์ ๊ฒ ๋๋ ๊ฒฝ๋ก์ ์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
๐ก์ฒซ๋ฒ์งธ ์์ด๋์ด
๋ค์ต์คํธ๋ผ ๋ฌธ์ ์ด์ง๋ง ๋๋ก๋ฅผ ํฌ์ฅํด์ผ ํ๋ค๋ ์ ์์ ๋ ์ด๋ ค์ ๋ค. ์คํฐ๋ ๋ฉํ ๋์ด ๊ฐ๋ฅด์ณ์ค ๋ฐฉ๋ฒ์ ์๋ ํ์ด์ ๊ฐ๋ค.
๐ฅํ์ด๐ฅ
์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ์์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ 1์ฐจ์ ๋ฐฐ์ด์ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ฐ๊พธ์ด dist[i][j]์์ j๋ ๋๋ก๋ฅผ ํฌ์ฅํ ํ์๋ฅผ ์๋ฏธํ๋ค.
๋ฐ๋ผ์ ๋ค์ต์คํธ๋ผ๋ก ๊ตฌํํ๋ j๊ฐ์ด ๋ฌธ์ ์์ ์ฃผ์ด์ง๋ ํฌ์ฅ๊ฐ๋ฅํ ๋๋ก์ ๊ฐ์ k๋ณด๋ค ์์ ๋ ๋๋ก๋ฅผ ํ ๋ฒ ํฌ์ฅํ ๊ฐ์ j+1์ ๋ฃ์ด์ฃผ๊ณ ํฌ์ฅํ์ง ์์์ ๋์ ๊ฐ์ j์ ์ ๋ฐ์ดํธ ํด์ค๋ค.
์ ์ n์ ๋์ฐฉํ๋ฉด breakํด์ฃผ๊ณ ๋์๋ ๋๋ก๋ฅผ ๋ช๋ฒ ํฌ์ฅํ์ ๋ ๊ฐ์ฅ ์ต์์ธ์ง๋ฅผ ๋น๊ตํด์ ์ต์๊ฐ์ ์ฐพ์์ค๋ค. (k๋ฅผ ๋ค ์ฐ์ง ์๊ณ ๋ ์ต์๊ฐ์ผ ์ ์์)
โํธ๋ฌ๋ธ ์ํ
๊ฐ์ ๋ฒ์๋ฅผ ์ ๋๋ก ํ์ธํ์ง ์์ ๊ฐ์ด ์ ๋๋ก ๋ด๊ธฐ์ง ์์์
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#define INF 90000000000
using namespace std;
int n, m, k;
long long dist[10002][21];
vector<vector<pair<int, int>>> edge;
int main() {
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) {
dist[i][j] = INF;
}
}
int a, b, c;
edge.resize(n + 1);
for (int i = 0; i < m; i++) {
cin >> a >> b >> c;
edge[a].push_back({b, c});
edge[b].push_back({a, c});
}
priority_queue<pair<long long, pair<int, int>>> pq; //๊ฑฐ๋ฆฌ, ์ ์ , ํฌ์ฅ๊ฐ์
pq.push({0, {1, 0}});
while (!pq.empty()) {
long long weight = -pq.top().first;
int vertex = pq.top().second.first;
int packed = pq.top().second.second;
pq.pop();
if (vertex == n) break;
if (weight > dist[vertex][packed]) continue;
for (auto e: edge[vertex]) {
int next = e.first;
long long cost;
if (packed < k) {
cost = 0;
if (dist[next][packed + 1] > weight + cost) {
dist[next][packed + 1] = weight + cost;
pq.push({-(weight + cost), {next, packed + 1}});
}
}
cost = e.second;
if (dist[next][packed] > weight + cost) {
dist[next][packed] = weight + cost;
pq.push({-(weight + cost), {next, packed}});
}
}
}
long long min_cost = INF;
for (int i = 0; i <= k; i++) {
if (min_cost > dist[n][i]) min_cost = dist[n][i];
}
cout << min_cost;
}
๐์ฐธ๊ณ ํ ๋ฌธ์
'๋ฐฑ์ค > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 2252๋ฒ ์ค ์ธ์ฐ๊ธฐ (0) | 2022.07.16 |
---|---|
[๋ฐฑ์ค/C++] 2056๋ฒ ์์ (0) | 2022.07.16 |
[๋ฐฑ์ค/C++] 1005๋ฒ ACM Craft (0) | 2022.07.16 |
[๋ฐฑ์ค/C++] 2098๋ฒ ์ธํ์ ์ํ (0) | 2022.07.16 |
[๋ฐฑ์ค/C++] 1753๋ฒ ์ต๋จ๊ฒฝ๋ก (0) | 2022.07.15 |