본문 바로가기

알고리즘/BOJ

1162번

1162번 - 도로 포장


다익스트라를 이용해서 문제를 풀었다. 그런데 어떤 점을 큐에 넣을 때 판단해야 할 점이 하나 더 있었다.


포장한 도로이지 아닌지 여부를 파악해줘야 했다. 다행히 저번에 BFS를 3차원배열을 이용해서 풀었던 문제와 비슷했다.


차원을 하나 더 추가하면서 풀 수 있게 됐다.


기본적인 로직은 다익스트라로, 그 다음 dist 배열에 오면서 몇번이나 포장했는지 여부를 저장하면서 문제를 풀었다.


####


점을 방문했을 때의 상태를 한 차원 더 표현하면 문제가 쉬워질 수 있다.


<정답 코드>


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
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
 
const int INF = 987654321;
int main()
{
    //freopen("input.txt", "r", stdin);
    int n, m, k;
    cin >> n >> m >> k;
    vector<vector<pair<intint>>> v(n + 1);
    while (m--)
    {
        int from, to, w;
        cin >> from >> to >> w;
        v[from].push_back({ to,w });
        v[to].push_back({ from,w });
    }
 
    int start = 1, dest = n;
    vector<vector<int>> dist(n + 1vector<int>(k+1,INF) );
    dist[start][0= 0;
    priority_queue<pair<pair<intint>int>> q;
    q.push({ { 0 ,start },0 });
 
    while (!q.empty())
    {
        int here = q.top().first.second;;
        int cost = -q.top().first.first;
        int used = q.top().second;
        q.pop();
 
        if (cost > dist[here][used])
        {
            continue;
        }
 
        for (int i = 0; i < v[here].size(); i++)
        {
            int there = v[here][i].first;
            int w = v[here][i].second;
            int t_use = used;
 
            if (t_use < k)
            {
                if (dist[there][t_use + 1> cost)
                {
                    dist[there][t_use + 1= cost;
                    q.push({ { -dist[there][t_use + 1],there },t_use + 1 });
                }
            }
            if (dist[there][t_use] > cost + w)
            {
                dist[there][t_use] = cost + w;
                q.push({ {-dist[there][t_use],there},t_use });
            }
        }
    }
 
    int minn = INF;
    for (int i = 0; i <= k; i++)
    {
        if (dist[n][i] < INF)
        {
            minn = dist[n][i];
        }
    }
 
    cout << minn << endl;
 
    return 0;
}
cs


반응형

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

1219번  (2) 2018.02.19
10217번  (0) 2018.02.19
6118번  (0) 2018.02.17
1719번  (0) 2018.02.17
4811번  (2) 2018.02.16