Cod sursa(job #2832962)

Utilizator StefantimStefan Timisescu Stefantim Data 14 ianuarie 2022 15:33:45
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

const int INF = 0x3f3f3f3f;
const int NMAX = 50005;
int n, m;
int D[NMAX];
bool InQueue[NMAX];


struct numar
{
    int nr, c;
};
vector <numar> G[NMAX];

struct cmp
{
    bool operator()(int x, int y)
    {
        return D[x] > D[y];
    }
};
priority_queue <int,vector <int>,  cmp> Q;


int main()
{
    numar t;
    int prim = 1, nod_curent;
    int a, b, c;
    fin >> n >> m;

    for(int i = 1; i <= n; i++)
        D[i] = INF;
    D[prim] = 0;

    for(int i = 1; i <= m; i++)
    {
        fin >> a >> b >> c;
        t.nr = b;
        t.c = c;
        G[a].push_back(t);
    }

    Q.push(prim);
    InQueue[prim] = true;
    while(!Q.empty())
    {
        nod_curent = Q.top();
        Q.pop();
        InQueue[nod_curent] = false;
        for(unsigned int i = 0; i < G[nod_curent].size(); i++)
        {
            t = G[nod_curent][i];
            if(D[t.nr] > t.c + D[nod_curent])
            {
                D[t.nr] = t.c + D[nod_curent];
                if(!InQueue[t.nr])
                {
                    Q.push(t.nr);
                    InQueue[t.nr] = true;
                }
            }
        }
    }

    for(int i = 2; i <= n; i++)
    {
        if(D[i] != INF)
            fout << D[i] << " ";
        else
            fout << "0 ";
    }
    return 0;
}