Cod sursa(job #2665614)

Utilizator cezardoroDorobat Cezar cezardoro Data 31 octombrie 2020 10:10:54
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <queue>
#define infinit 100000000

using namespace std;

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

int n, m, a[50005][50005], drum[50005];
priority_queue <pair <int, int> > Q;

void Read()
{
    fin >> n >> m;
    int x, y, c;
    for (int i = 1; i <= m; i++)
    {
        fin >> x >> y >> c;
        a[x][y] = c;
        a[y][x] = c;
    }
}

void Initializare ()
{
    for (int i = 1; i <= n; i++)
        drum[i] = infinit;
}

void Dijkstra ()
{
    int NodDinCareVin, CostMuchieNodDinCareVin, NodIncareMaDuc;
    Q.push ({0, 1});
    drum[1] = 0;
    while (!Q.empty ())
    {
        NodDinCareVin = Q.top().second;
        Q.pop();

        for (int i = 1; i <= n; i++)
            if (a[NodDinCareVin][i] != 0)
            {
                NodIncareMaDuc = i;
                CostMuchieNodDinCareVin = a[NodDinCareVin][NodIncareMaDuc];
                if (drum[NodIncareMaDuc] > drum[NodDinCareVin] + CostMuchieNodDinCareVin)
                {
                    drum[NodIncareMaDuc] = drum[NodDinCareVin] + CostMuchieNodDinCareVin;
                    Q.push ({-drum[NodIncareMaDuc], NodIncareMaDuc});
                }
            }
    }

    for (int i = 2; i <= n; i++)
        if (drum[i] != infinit)
            fout << drum[i] << " ";

}

int main()
{
    Read();
    Initializare();
    Dijkstra();
    return 0;
}