Dijkstra (다익스트라)

코드

문제 풀다가.. 생각나서 문서화 함

아래는 우선순위큐로 짠 코드

이 문서를 보는 신입이 고쳐줄거라 믿고있음 ㅇㅇ

#include <stdio.h>
#include <vector>
#include <queue>
#include <memory.h>
#include <algorithm>

using namespace std;

vector< pair<int, int> > g[801];

int dij(int s, int d) {
    priority_queue< pair<int, int> > q;
    int dist[801], i;

    memset(dist, 0x7F, sizeof(dist));
    dist[s] = 0;
    for ( i = 0; i < g[s].size(); i++ ) {
        q.push(make_pair(-g[s][i].second, g[s][i].first));
        dist[g[s][i].first] = g[s][i].second;
    }

    while( !q.empty() ) {
        pair<int, int> p = q.top();
        int w = -p.first;
        int v = p.second;
        q.pop();

        for ( i = 0; i < g[v].size(); i++ ) {
            pair<int, int> pu = g[v][i];
            int u = pu.first;
            int uw = dist[v] + pu.second;
            if ( dist[u] > uw ) {
                dist[u] = uw;
                q.push(make_pair(-uw, u));
            }
        }
    }

    return dist[d];
}

정리

  • 우선순위큐로 시간복잡도를 줄임
    • 일반적인 구현 (인접리스트, 인접행렬) : O(E+V^2)
    • 우선순위큐 : O(E+VlogV)

참고 자료

  • 종만북에 잘나옴
  • 잉여로운 신입들이 적어줬으면 좋겠다

관련 문제

  • 잉여로운 신입들이 적어줬으면 좋겠다

results matching ""

    No results matching ""