Cod sursa(job #1914181)

Utilizator MailatMailat Radu Mailat Data 8 martie 2017 15:52:37
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdtr1c++.h>
#define INF 1 << 30
#define maxn 500005
using namespace std;

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

list < pair <int, int> > A[maxn];
list < pair <int, int> > ::iterator it;
set <pair <int, int> > h;
vector <int> D;
int N, M, x0 = 1;

void init() {
    int x, y, c;
    fin >> N >> M;
    for(int i=0; i < M; i++) {
        fin >> x >> y >> c;
        A[x].push_back(make_pair(y,c));
    }
    for(int i=0; i<=N; i++) D.push_back(INF);

}

void dijkstra() {
    int node, to, cost;
    D[x0] = 0;
    h.insert(make_pair(0,x0));
    while(!h.empty()) {
        node = h.begin()->second;
        h.erase(h.begin());
        for(it = A[node].begin(); it != A[node].end(); ++it) {
            to = it->first;
            cost = it->second;
            if(D[to] > D[node] + cost) {
                if(D[to] != INF) h.erase(h.find(make_pair(D[to], to)));
                D[to] = D[node] + cost;
                h.insert(make_pair(D[to], to));
            }
        }
    }

}

int main()
{
    init();
    dijkstra();
    for(int i=2; i <= N; i++){
        if(D[i] == INF) D[i] = 0;
        fout << D[i] << " ";
    }
    return 0;
}