본문 바로가기

알고리즘/BOJ

10217번

10217번 - KCM Travel


이 문제도 이전 문제와 마찬가지로 다익스트라를 기반으로 한차원 늘려서 문제를 풀었다.


시간제한이 10초이기 때문에 시간도 넉넉했다.


dist[n][k] 라는 이차원 배열이 n노드까지 k원일때 최단거리라고 만들어서 문제를 풀 수 있었다.


그렇게 해서 다음 정점 노드의 시간값이 최소시간이고, 가격이 m원 이하일 때만 큐에 넣어서 다익스트라로 풀었다.


<정답 코드>


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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
typedef struct
{
    int to;
    int price;
    int time;
}E;
 
const int INF = 987654321;
int main()
{
    //freopen("input.txt", "r", stdin);
    int tc;
    cin >> tc;
    while (tc--)
    {
        int n, m, k;
        cin >> n >> m >> k;
 
        vector<vector<E>> v(n + 1);
 
        while (k--)
        {
            int from;
            E ed;
            cin >> from >> ed.to >> ed.price >> ed.time;
            v[from].push_back(ed);
        }
 
        vector<vector<int>> dist(n + 1,vector<int>(10001,INF));
 
        priority_queue<pair<pair<int,int>,int>> q;
        dist[1][0= 0;
        q.push({ {0,1},0 });
 
        while (!q.empty())
        {
            int here = q.top().first.second;
            int cost_t = -q.top().first.first;
            int cost_p = q.top().second;
            q.pop();
 
            if (cost_t > dist[here][cost_p])
            {
                continue;
            }
 
            for (int i = 0; i < v[here].size(); i++)
            {
                int there = v[here][i].to;
                int c_cost_t = v[here][i].time;
                int c_cost_p = v[here][i].price;
 
                if (c_cost_p + cost_p <= m)
                {
                    if (dist[there][c_cost_p+cost_p] > c_cost_t + cost_t)
                    {
                        dist[there][c_cost_p + cost_p] = c_cost_t + cost_t;
                        q.push({ {-dist[there][c_cost_p + cost_p],there},c_cost_p + cost_p });
                    }
                }
            
            }
        }
        int minn = INF;
        for (int i = 0; i <= 10000; i++)
        {
            if (dist[n][i] < minn)
            {
                minn = dist[n][i];
            }
        }
 
        if (minn == INF)
        {
            cout << "Poor KCM\n";
        }
        else
        {
            cout << minn << "\n";
        }
    }
 
    return 0;
}
cs


반응형

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

1613번  (0) 2018.02.20
1219번  (2) 2018.02.19
1162번  (0) 2018.02.18
6118번  (0) 2018.02.17
1719번  (0) 2018.02.17