Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 1162 도로포장 본문

Programming/BOJ

[백준/BOJ] 1162 도로포장

he1fire 2020. 10. 2. 23:43
728x90

문제 : 1162 도로포장

 

1162번: 도로포장

첫 줄에는 도시의 수 N(1 ≤ N ≤ 10,000)과 도로의 수 M(1 ≤ M ≤ 50,000)과 포장할 도로의 수 K(1 ≤ K ≤ 20)가 공백으로 구분되어 주어진다. M개의 줄에 대해 도로를 연결짓는 두 도시와 도로를 통과하�

www.acmicpc.net

길을 지나는데 걸리는 시간과 포장해서 지나는 시간을 0으로

만들 수 있는 횟수가 주어졌을 때, 최소 시간을 구하는 문제이다.

visit배열을 만들 때 1차원이 아니라 2차원으로 만든 후

Dijkstra 알고리즘을 사용해 지금까지 포장한 도로 개수당 최솟값을 구하면 된다.

최소 시간이 최대 10,000,000,000까지 커질 수 있으므로

배열의 초기값을 그보다 더 크게 잡아야 하는 것에 주의하자


Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e10+7
using namespace std;
struct ABC{
    ll idx, dst, pac;
    ABC(){}
    ABC(ll idx, ll dst, ll pac) : idx(idx), dst(dst), pac(pac) {}
};
bool operator<(ABC x, ABC y){
    return x.dst>y.dst;
}
ll N, M, K, visit[10005][25];
vector<ABC> arr[10005];
priority_queue<ABC> pq;
ll Dijkstra(ll st, ll ed){
    fill(&visit[0][0],&visit[10004][25],INF);
    pq.push({st,0,0});
    visit[st][0]=0;
    while (!pq.empty()){
        ll x=pq.top().idx, curr=pq.top().dst, pack=pq.top().pac;
        pq.pop();
        if (visit[x][pack]<curr)
            continue;
        for (int i=0;i<arr[x].size();i++){
            ll dx=arr[x][i].idx, next=arr[x][i].dst;
            if (visit[dx][pack]>curr+next){
                visit[dx][pack]=curr+next;
                pq.push({dx,curr+next,pack});
            }
            if (pack<K && visit[dx][pack+1]>curr){
                visit[dx][pack+1]=curr;
                pq.push({dx,curr,pack+1});
            }
        }
    }
    ll ret=INF;
    for (int i=0;i<=K;i++){
        ret=min(visit[N][i],ret);
    }
    return ret;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N >> M >> K;
    for (int i=0;i<M;i++){
        ll a, b, c;
        cin >> a >> b >> c;
        arr[a].push_back({b,c,0});
        arr[b].push_back({a,c,0});
    }
    cout << Dijkstra(1, N);
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 18116 로봇 조립  (0) 2020.10.09
[백준/BOJ] 13140 Hello World!  (0) 2020.10.07
[백준/BOJ] 1446 지름길  (0) 2020.09.30
[백준/BOJ] 1766 문제집  (0) 2020.09.29
[백준/BOJ] 2056 작업  (0) 2020.09.29
Comments