Cod sursa(job #2199007)

Utilizator codrin18Diac Eugen Codrin codrin18 Data 26 aprilie 2018 09:37:44
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cassert>
#include <cstring>
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
const int oo = 1<<30;
struct _arc
{
    int cost, destinatie;
} arc;
struct nod
{
    vector<_arc> v;
} v[50001];

struct cmp
{   inline bool operator()(_arc a1,_arc a2)  {return (a1.cost>a2.cost);}
};

vector<_arc> h;
bool viz[50001];
int sol[50001];

int main()
{
    int n, m, a, b, c;
    in>>n>>m;
    for(int i=2; i<=n; i++) sol[i] = oo;
    for(int i=1; i<=m; i++)
    {
        in>>a>>b>>c;
        arc.destinatie = b;
        arc.cost = c;
        v[a].v.push_back(arc);
    }
    sol[1] = 0;
    for(unsigned int i=0; i< v[1].v.size(); i++)
    {
        h.push_back(v[1].v[i]);
        sol[v[1].v[i].destinatie] = v[1].v[i].cost;
    }
    make_heap(h.begin(), h.end(), cmp());
    viz[1] = true;

    while(!h.empty())
    {

        arc = h.front();
        pop_heap(h.begin(), h.end(), cmp());
        h.pop_back();
        if(arc.cost <= sol[arc.destinatie])
            sol[arc.destinatie] = arc.cost;
        if(!viz[arc.destinatie]){
        viz[arc.destinatie] = true;
        for(uint32_t i=0; i< v[arc.destinatie].v.size(); i++)
        {

            if(!viz[v[arc.destinatie].v[i].destinatie])
            {
                v[arc.destinatie].v[i].cost += arc.cost;
                h.push_back(v[arc.destinatie].v[i]);
                push_heap(h.begin(), h.end(), cmp());
            }
        }}
    }
    for(int i=2; i<=n; i++)
        if(sol[i] == oo)
           out<<0<<' ';
        else out<<sol[i]<<' ';
    return 0;
}