Cod sursa(job #2154008)

Utilizator LoganCarlos Mensia Logan Data 6 martie 2018 17:13:11
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
const int nmax = 50005;
const int inf = 1 << 30;
int n, m;
vector < int > D;
vector < bool > InCoada;
vector < pair < int, int > > A[nmax];
priority_queue < int, vector < int >, less<int>> Q;

bool dist(int a, int b) { return a<b;}

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

void Dijkstra(int NS)
{
    D.resize(n+1);
    InCoada.assign(n+1,0);
    for(int i = 1; i <= n; i++) D[i] = inf;

    D[NS] = 0;
    Q.push(NS);
    InCoada[NS] = true;

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

        for(int i = 0; i < A[NC].size(); i++)
        {
            int Vecin = A[NC][i].first;
            int Cost = A[NC][i].second;
            if(D[NC] + Cost < D[Vecin])
            {
                D[Vecin] = D[NC] + Cost;
                if(InCoada[Vecin] == false)
                {
                    Q.push(Vecin);
                    InCoada[Vecin] = true;
                }
            }
        }
    }
}

void Afisare()
{
    for(int i = 2; i <= n; ++ i)
    {
        if(D[i] != inf) cout << D[i] << ' ';
        else cout << "0 ";
    }
}

int main()
{
    Citire();
    Dijkstra(1);
    Afisare();
}