Cod sursa(job #2552951)

Utilizator Robys01Robert Sorete Robys01 Data 21 februarie 2020 13:08:26
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define NMAX 50001
#define MMAX 250001
#define INF (1<<30)
#define Nod second
#define Cost first
using namespace std;

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

int n, m, nr;
pair <int, int> vf[MMAX];
int urm[MMAX], last[NMAX], dist[NMAX];

priority_queue < pair <int, int> > Q;
bitset <NMAX> viz;

void adauga(int nod, int v, int pret)
{
    vf[++nr].Nod = v;
    vf[nr].Cost = pret;
    urm[nr] = last[nod];
    last[nod] = nr;

}

void citire()
{
    fin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int x, y, c;
        fin>>x>>y>>c;
        adauga(x, y, c);
    }

}

void dijkstra(int start)
{
    Q.push( {0, start} );

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

        int nod = Q.top().Nod; int cost = -Q.top().Cost;
        Q.pop();

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

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

    }

    for(int i = 2; i<=n; i++)
        fout<<dist[i]<<' ';

}

int main()
{
    citire();
    dijkstra(1);
    return 0;
}
//*/