Cod sursa(job #2574782)

Utilizator niculaandreiNicula Andrei Bogdan niculaandrei Data 6 martie 2020 09:52:16
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define N_MAX 50005

using namespace std;

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

int N, M;

vector < pair < int, int > > G[N_MAX];

priority_queue < pair < int, int >, vector < pair < int, int > >, greater < pair < int, int > > > PQ;
int vis[N_MAX], D[N_MAX];

void Dijkstra()
{
    int currNode = PQ.top().second;
    int currCost = PQ.top().first;
    PQ.pop();
    while (vis[currNode] == 1 && PQ.size())
    {
        currNode = PQ.top().second;
        currCost = PQ.top().first;
        PQ.pop();
    }
    vis[currNode] = 1;
    for (pair < int, int > node: G[currNode])
        if (vis[node.second] == 0 && D[node.second] > currCost + node.first)
        {
            D[node.second] = currCost + node.first;
            PQ.push(make_pair(D[node.second], node.second));
        }
    if (PQ.size())
        Dijkstra();
}

int main()
{
    fin >> N >> M;
    for (int i = 1; i <= M; i++)
    {
        int x, y, c;
        fin >> x >> y >> c;
        G[x].push_back(make_pair(c, y));
    }

    for (int i = 1; i <= N; i++)
        D[i] = INT_MAX / 2;
    D[1] = 0;

    PQ.push(make_pair(0, 1));
    Dijkstra();

    for (int i = 2; i <= N; i++)
        fout << D[i] << " ";
    return 0;
}