Cod sursa(job #1771448)

Utilizator margikiMargeloiu Andrei margiki Data 5 octombrie 2016 17:26:40
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
# include <bits/stdc++.h>
# define INF 999999999
# define NR 100005
# define mp make_pair
# define f first
# define s second
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
vector <pair <int, int> > v[NR], HEAP;
int n,m,x,y,cost;
int drum[NR];
void baga (int cost, int x) {
    HEAP.push_back(mp(cost, x));
    push_heap(HEAP.begin(), HEAP.end());
}
void scoate () {
    pop_heap(HEAP.begin(), HEAP.end());
    HEAP.pop_back();
}
void dijkstra() {
    while (HEAP.size()) {
        int cact=-HEAP[0].f;
        int X=HEAP[0].s;

        scoate();

        if (cact > drum[X]) continue;

        for (auto &x: v[X]) {
            if (cact + x.s < drum[x.f]) {
                drum[x.f]=cact + x.s;
                baga(-drum[x.f], x.f);
            }
        }
    }
}
int main ()
{
    f>>n>>m;
    for (int i=1; i<=m; ++i) {
        f>>x>>y>>cost;

        v[x].push_back(mp(y, cost));
    }

    for (int i=2; i<=n; ++i) {
        drum[i]=INF;
    }

    baga (0, 1);
    dijkstra ();

    for (int i=2; i<=n; ++i) {
        if (drum[i]==INF) g<<"0 ";
                     else g<<drum[i]<<" ";
    }
    g<<"\n";

    return 0;
}