Cod sursa(job #1337063)

Utilizator retrogradLucian Bicsi retrograd Data 8 februarie 2015 16:04:33
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include<fstream>
#include<vector>
#include<algorithm>

using namespace std;
typedef int64_t var;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

const var MAXN = 50001;
const var INF = 1000000001;

struct Edge {
    var n, c;
    Edge(var a, var b) {
        n = a; c = b;
    }
};

vector<Edge> G[MAXN];
var H[MAXN], POS[MAXN], COST[MAXN], n, heapsize;



void swapp(var n1, var n2) {
    swap(H[n1], H[n2]);
    swap(POS[H[n1]], POS[H[n2]]);
}

void heap_up(var node) {
    if(node > 1 && COST[H[node/2]] > COST[H[node]]) {
        swapp(node, node/2);
        heap_up(node/2);
    }
}

void heap_down(var node) {
    if(node*2 > heapsize) return;
    var next = node*2;

    if(next+1 <= heapsize && COST[H[next+1]] < COST[H[next]]) {
        next++;
    }

    if(COST[H[node]] > COST[H[next]]) {
        swapp(node, next);
        heap_down(next);
    }
}

bool cmp(var a, var b) {
    if(COST[a] > COST[b]) {
        swap(POS[a], POS[b]);
        return 1;
    }
    return 0;
}

var extract_min() {
    var MIN = H[1];
    swapp(1, heapsize --);
    heap_down(1);
    heapsize ++;
    H[heapsize --] = 0;
    return MIN;
}



void dijkstra(var start) {

    for(var i=1; i<=n; i++) {
        H[i] = i;
        POS[i] = i;
        COST[i] = INF;
    }

    COST[start] = 0;
    heapsize = n;

    while(heapsize) {
        var node = extract_min();
        for(vector<Edge>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
            var vec = (*it).n;
            if(COST[vec] > COST[node] + (*it).c) {
                COST[vec] = COST[node] + (*it).c;
                heap_up(POS[vec]);
            }
        }
    }
}


int main() {

    var m, a, b, c;

    fin>>n>>m;
    while(m--) {
        fin>>a>>b>>c;
        G[a].push_back(Edge(b, c));
    }

    dijkstra(1);

    for(var i=2; i<=n; i++) {
        if(COST[i] < INF) {
            fout<<COST[i]<<" ";
        } else {
            fout<<0<<" ";
        }
    }

    return 0;
}