개발일지

Algorithm in A..Z - Dijkstra 본문

Algorithm (알고리즘)

Algorithm in A..Z - Dijkstra

강태종 2020. 12. 1. 01:24

개념

최단거리를 구하는 알고리즘이다.

최단거리 + 최단거리 = 최단거리라는 그리디한 개념으로 최단거리를 찾는다.

=> 간선의 가중치가 음수인게 존재하면 다익스트라를 사용할 수 없다. (최단거리 + 최단거리 = 최단거리라는 보장이 깨지기 때문에)


작동원리

1. 시작 노드를 우선순위 큐에 넣는다.

2. 우선순위 큐에서 POP을한다.

3. POP한 노드가 최단거리이면 해당 노드에서 갈 수 있는 노드중 거리를 갱신하는 노드를 우선순위 큐에 PUSH한다.

4. 2 ~ 3을 우선순위 큐가 EMPTY가 될 때까지 한복한다.


시간복잡도

O(ElogV)


문제

11779 최소비용 구하기 2

www.acmicpc.net/problem/11779

 

11779번: 최소비용 구하기 2

첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스

www.acmicpc.net


코드

#include <bits/stdc++.h>
using namespace std;

constexpr int NONE = 0;

class Node {
public:
    int vertex, distance;

    Node(int vertex = 0, int distance = 0) : vertex(vertex), distance(distance) {

    }

    bool operator>(const Node &o) const {
        return distance > o.distance;
    }
};

int main() {
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<vector<Node>> map(n + 1);
    while (m--) {
        int source, destination, distance;
        cin >> source >> destination >> distance;

        map[source].emplace_back(destination, distance);
    }

    int source, destination;
    cin >> source >> destination;

    priority_queue<Node, vector<Node>, greater<>> que;
    vector<int> pre(n + 1, NONE);
    vector<long long> distance(n + 1, INT64_MAX);

    que.emplace(source, 0L);
    distance[source] = 0L;
    while (!que.empty()) {
        auto now = que.top(); que.pop();

        if (distance[now.vertex] == now.distance) {
            for (auto next : map[now.vertex]) {
                if (distance[next.vertex] > now.distance + next.distance) {
                    pre[next.vertex] = now.vertex;
                    distance[next.vertex] = now.distance + next.distance;
                    que.emplace(next.vertex, now.distance + next.distance);
                }
            }
        }
    }

    cout << distance[destination] << "\n";

    stack<int> st;
    while (destination != NONE) {
        st.emplace(destination);
        destination = pre[destination];
    }

    cout << st.size() << "\n";
    while (!st.empty()) {
        cout << st.top() << " ";
        st.pop();
    }
}

'Algorithm (알고리즘)' 카테고리의 다른 글

Algorithm in A..Z - SPFA  (0) 2020.12.03
Algorithm in A..Z - MST (Prim)  (0) 2020.12.01
Algorithm in A..Z - 유클리드 호제법  (0) 2020.12.01
Algorithm in A..Z - 에라토스테네스의 체  (0) 2020.11.28
Android in A..Z - DFS  (0) 2020.11.28
Comments