Cod sursa(job #1346989)

Utilizator retrogradLucian Bicsi retrograd Data 18 februarie 2015 18:35:58
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<fstream>
#include<vector>
#include<set>

using namespace std;
typedef int64_t var;

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

#define MAXN 50001
#define INF ((1LL)<<62)


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


var DIST[MAXN];
vector<Edge> G[MAXN];
var n;

struct cmp {
    const bool operator () (const var &a, const var &b) const {
        if(DIST[a] < DIST[b]) {
            return 1;
        } else if(DIST[a] == DIST[b] && a<b) {
            return 1;
        }
        return 0;
    }
};
multiset<var, cmp> SET;

void dijkstra(var start) {
    for(var i=1; i<=n; i++) {
        DIST[i] = INF;
    }
    DIST[start] = 0;
    SET.insert(start);
    //SET.insert(2);

    while(!SET.empty()) {
        var node = *(SET.begin());
        SET.erase(SET.begin());

        for(vector<Edge>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
            Edge &e = *it;
            if(DIST[e.n] > DIST[node] + e.c) {

                set<var>::iterator itt = SET.find(e.n);
                if(itt != SET.end()) {
                    SET.erase(itt);
                }
                DIST[e.n] = DIST[node] + e.c;
                SET.insert(e.n);
            }
        }
    }
}

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++) {
        fout<<((DIST[i] < INF) ? (DIST[i]) : 0)<<" ";
    }
}