#문제

https://www.acmicpc.net/problem/10217

 

10217번: KCM Travel

각고의 노력 끝에 찬민이는 2014 Google Code Jam World Finals에 진출하게 되었다. 구글에서 온 초대장을 받고 기뻐했던 것도 잠시, 찬찬히 읽어보던 찬민이는 중요한 사실을 알아차렸다. 최근의 대세에 힘입어 구글 역시 대기업답게 비용 감축에 열을 내고 있었던 것이다. 초대장 내용에 의하면 구글은 찬민에게 최대 M원까지의 비용만을 여행비로써 부담해주겠다고 한다. 인천에서 LA행 직항 한 번 끊어주는게 그렇게 힘드냐고 따지고도 싶었지만,

www.acmicpc.net

 

#작성 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
 
int tc, n, m, k;
vector<pair<intpair<intint> > > air[101];        // 인덱스 1~100 사용 
// air[출발공항]에 도착공항, 비용, 소요시간 저장. 
priority_queue<pair<int,pair<intint> > > pq;
int path[101][10001];
// 1번에서 i로 가는 최소 티켓가격1~10000에 따른 이동시간[i][1~10000] 저장. 
// 예산 내의 각 cost에 대해서 이동시간을 계산하고, n번째 공항의 각 cost에 따른 이동시간 중 최단시간을 고르자 
int INF = 987654321;
 
int main(){
    cin>>tc;
    while(tc--){
        // air 벡터와 path배열 초기화
        for(int i=0; i<101; i++){
            air[i].clear();
            fill_n(path[i], 10001, INF);
        }
        path[1][0= 0;        // 인천은 언제나 인덱스 1, 모든 cost 에 대해 0 
        
        // 입력
        cin>>n>>m>>k;
        for(int i=0; i<k; i++){
            int start, dest, cost, time;
            cin>>start>>dest>>cost>>time;
            air[start].push_back(make_pair(dest, make_pair(cost, time)));
        }
        // 1으로 가는 비용 음수화한 것, 1으로 가는 최단시간, 출발공항 번호 1 
        pq.push(make_pair(0,make_pair(01)));
        
        while(!pq.empty()){
            int nowcost = -pq.top().first;
            int nowtime = pq.top().second.first;
            int now = pq.top().second.second;
            pq.pop(); 
            
            if( path[now][nowcost] < nowtime ) continue;
            for(int i=0; i<air[now].size(); i++){
                int next = air[now][i].first;
                int nextcost = air[now][i].second.first+nowcost;
                int nexttime = air[now][i].second.second+nowtime;
                 
                // 1~now 비용 + now~next 비용 <= 예산(m) 일 때
                // 소요시간이 단축된다면 업데이트 한다.
                if( nextcost <= m ){
                    if( nexttime < path[next][nextcost] ){
                        path[next][nextcost] = nexttime;
                        pq.push(make_pair(-nextcost, make_pair(nexttime, next)));
                    }
                }
            }
        } 
        
        int mintime=INF;
        for(int i=0; i<=m; i++){
            mintime = min(mintime,path[n][i]);
        }
        if( mintime!=INF ){
            cout<<mintime<<'\n';
        }
        else{
            cout<<"Poor KCM\n";
        }
    }
    return 0
}
cs

##

인천(1번 노드)에서 출발해서 무조건 LA(n번 노드)로 가는 최단 비행 시간을 구해야 한다.

단일 출발지~ 다른 모든 노드로까지의 최단 경로를 구하는 다익스트라 알고리즘을 사용했다.

 

처음에는 예산 내에서 새로 생기는 cost가 예산 내라면 항상 업데이트하면서 그에 따른 비행시간이 단축된다면 업데이트 했는데,

이렇게 풀면 중간 노드까지의 최단비행시간이 아니더라도, 최종 목적지까지 가는 최단비행경로에 포함되는 간선이 있다면 업데이트 할 수 없게된다.

-> 각 노드까지 가는 cost가 어떤지에 따른 최단 비행시간을 업데이트해서 해결했다.

path[101][10001] : path[i][m]에는 i노드까지 가는 cost가 m일 때 최단비행시간을 저장한다.

'BOJ' 카테고리의 다른 글

BOJ 4949번 :: 균형잡힌 세상  (0) 2019.12.22
BOJ 2981번 :: 검문  (0) 2019.12.22
BOJ 11653번 :: 소인수분해  (0) 2019.12.21
BOJ 11404번 :: 플로이드  (0) 2019.12.20
BOJ 1541번 :: 잃어버린 괄호  (0) 2019.12.20

+ Recent posts