[λ°±μ€/C++] 1162λ² λλ‘ν¬μ₯


π€λ¬Έμ μ΄ν΄
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++] 1753λ² μ΅λ¨κ²½λ‘
π€λ¬Έμ μ΄ν΄ μμμ μμ κ° μ μ μ λ°©λ¬ΈνκΈ° μν΄ νμν μ΅μ λΉμ©μ ꡬνλ λ¬Έμ μ΄λ€. π‘첫λ²μ§Έ μμ΄λμ΄ λ¬Έμ κ° κ·Έλ₯ λ± λ€μ΅μ€νΈλΌ λ¬Έμ λΌ λ€μ΅μ€νΈλΌλ₯Ό μ΄μ©νλ€. π₯νμ΄π₯ λ€μ΅μ€νΈλΌ
yulee.tistory.com