어흥

[백준 1446] 지름길 (C++) 본문

알고리즘/백준

[백준 1446] 지름길 (C++)

라이언납시오 2021. 3. 18. 20:47
728x90
반응형

문제 링크: www.acmicpc.net/problem/1446

 

1446번: 지름길

첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하이고, D는 10,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주

www.acmicpc.net

1. 주의할 점

- 최단거리가 지름길을 안탈수도 있는 경우가 있다

 

2. 구현

- Dist[]를 통해 0부터 각 지점까지의 길이를 미리 저장한다

- 지름길에 대한 정보를 받을 때, 지름길의 도착지점이 목표지점을 넘어가거나, 사실상 지름길이 아닌 경우는 제외한다

- 0부터 도착지점까지 Dist[] 배열을 갱신하며, 만약 해당 지점에 지름길이 있는 경우, 지름길의 반대편까지의 거리를 기존 길이와 비교하여 지름길을 사용했을 때 더 짧다면 Dist[]를 갱신한다

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct info{
    int idx,val;
};
info tmp;
int dist[10001];
vector<info> v[10001];
int main() {
    int num, goal,s,e,val,before;
    cin>>num>>goal;
    for(int i=1;i<=goal;i++)
        dist[i]=i;
    for(int i=0;i<num;i++){
        cin>>s>>e>>val;
        if(e-s<=val) continue;      //사실상 지름길이 아닌 경우
        if(e>goal) continue;        //목적지를 넘어가는 경우 -> 역주행 불가
        tmp.idx=e;
        tmp.val=val;
        v[s].push_back(tmp);
    }
    for(int i=0;i<=goal;i++){
        if(i==0) before = -1;
        else before = dist[i-1];
        dist[i]=min(dist[i],before+1);
        if(!v[i].empty()){
            for(int k=0;k<v[i].size();k++){
                int to = v[i][k].idx;
                int cost = v[i][k].val;
                if(to>goal) continue;
                if(dist[i]+cost<dist[to]){
                    dist[to] = dist[i] + cost;
                }
            }
        }
    }
    cout<<dist[goal];
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 13424] 비밀 모임 (C++)  (0) 2021.03.19
[백준 2307] 도로 검문 (C++)  (0) 2021.03.19
[백준 1484] 다이어트 (C++)  (0) 2021.03.18
[백준] 키 순서 (C++)  (0) 2021.03.17
[백준 2688] 줄어들지 않아 (C++)  (2) 2021.03.11
Comments