Cod sursa(job #2514518)

Utilizator Rares31100Popa Rares Rares31100 Data 26 decembrie 2019 12:09:29
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <queue>
#include <bitset>
#define Nod second
#define Val first

using namespace std;

ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");

int n,m;
pair <int,int> vf[250001];
int urm[250001],last[50001],nr;

priority_queue <pair<int,int>> coada;
int costMin[50001];
bitset <50001> viz;

void adauga(int from,int to,int cost)
{
    vf[++nr].Nod=to;
    vf[nr].Val=cost;
    urm[nr]=last[from];
    last[from]=nr;
}

void bfs(int start)
{
    coada.push({0,start});

    while(!coada.empty())
    {
        while(!coada.empty() && viz[ coada.top().Nod ]==1)
            coada.pop();

        if(coada.empty())
            break;

        int nod=coada.top().Nod,cost=-coada.top().Val;
        coada.pop();

        costMin[nod]=cost;
        viz[nod]=1;

        for(int k=last[nod];k;k=urm[k])
            if(viz[ vf[k].Nod ]==0)
                coada.push({-vf[k].Val-cost,vf[k].Nod});
    }
}

int main()
{
    cin>>n>>m;

    for(int i,j,cost,k=1;k<=m;k++)
    {
        cin>>i>>j>>cost;

        adauga(i,j,cost);
    }

    bfs(1);

    for(int i=2;i<=n;i++)
        cout<<costMin[i]<<' ';

    return 0;
}