PS/C++

[λ°±μ€€/C++] 1162번 λ„λ‘œν¬μž₯

yulee_to 2022. 7. 16. 18:14
728x90

λ°±μ€€
λ°±μ€€
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

 

728x90
λŒ“κΈ€μˆ˜0