Game Develop

[Algorithm]Baekjoon 1446번 : 지름길 본문

Algorithm/Baekjoon

[Algorithm]Baekjoon 1446번 : 지름길

MaxLevel 2024. 3. 8. 20:02

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

 

1446번: 지름길

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

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
71
72
73
74
75
76
77
78
 
 
using namespace std;
 
struct Node
{
    int dest;
    int cost;
};
 
struct cmp
{
    bool operator() (const Node& a, const Node& b)
    {
        return a.cost > b.cost;
    }
};
 
int n, d;
vector<vector<Node>> graph(10001);
int dist[10001= { 0 };
 
 
int Dijkstra()
{
    priority_queue<Node, vector<Node>, cmp> pq;
    dist[0= 0;
    pq.push({ 0,0 });
 
    while (!pq.empty())
    {
        int curPos = pq.top().dest; 
        int curCost = pq.top().cost;
        pq.pop();
 
        if (dist[curPos] < curCost) continue;
 
        for (int i = 0; i < graph[curPos].size(); ++i)
        {
            Node& nextNode = graph[curPos][i];
 
            if (curCost + nextNode.cost < dist[nextNode.dest])
            {
                dist[nextNode.dest] = curCost + nextNode.cost;
                pq.push({ nextNode.dest, dist[nextNode.dest] });
            }
        }
    }
 
    return dist[d];
}
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
 
    cin >> n >> d;
 
    for (int i = 0; i <= d - 1++i)
    {
        graph[i].push_back({ i + 1,1 });
    }
 
    for (int i = 0; i < n; ++i)
    {
        int a, b, c;
        cin >> a >> b >> c;
 
        graph[a].push_back({ b,c });
    }
 
    memset(dist, 0x3fsizeof(dist));
 
    cout << Dijkstra();
}
 
cs

 

오랜만에 풀어본 다익스트라문제다. 보통 기본적인 다익스트라문제라면 간선에대한 정보가 전부 주어지지만, 이번 문제같은 경우에는 직접 간선을 만들어서 그래프에 넣어줘야 한다.

이 문제에서 주어지는 간선에 대한 정보는 듬성듬성 특정지점과 특정지점을 연결해주는거라서 그렇다.

이런 특정간선을 제외하고는 한칸이동하는데에 드는 비용은 1이니, 맨 처음에 각자 다음칸이동하는 간선을 전부 넣어준다.

이후 특정간선에 대한 간선을 넣어주고 다익스트라를 수행하면 값이 나온다.

 

이게 간선정보 주어지는게 최대 12개밖에 안주어지다보니까, 굳이 다익스트라말고 거의 완전탐색으로 푸는것도 가능하긴하다.