Cod sursa(job #2552898)

Utilizator Robys01Robert Sorete Robys01 Data 21 februarie 2020 12:15:29
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
#define NMAX 100001
#define INF (1<<30)
using namespace std;

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

int n, m, nodStart;
int dist[NMAX];
bool InCoada[NMAX];
vector < pair <int, int> > A[NMAX];
priority_queue < pair < int, int > >Q;

void citire()
{
    fin>>n>>m;
    for(int i = 1; i <= m; i++)
    {
        int x, y, cost; fin>>x>>y>>cost;
        A[x].push_back({y, cost});
    }
}

void dijkstra(int nodStart)
{
    for(int i=1; i<=n; i++)
        dist[i] = INF;
    dist[nodStart] = 0;
    Q.push({0, nodStart});

    InCoada[nodStart] = true;

    while(!Q.empty())
    {
        int a = Q.top().second;
        Q.pop();
        InCoada[a] = false;

        for(auto k : A[a])
        {
            int Vecin = k.first; int Cost = k.second;

            if(dist[Vecin] > dist[a] + Cost)
            {
                dist[Vecin] = dist[a] + Cost;
                if(!InCoada[Vecin])
                {
                    Q.push( {-dist[Vecin], Vecin});
                    InCoada[Vecin] = true;
                }
            }
        }

    }

    for(int i=2; i<=n; i++)
        fout<<(dist[i] != INF ? dist[i] : -1)<<' ';

}


int main()
{
    citire();
    dijkstra(1);

    return 0;
}