Cod sursa(job #3324548)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 22 noiembrie 2025 14:18:00
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
const int NMax = 50000;
const int oo = 1e9;
vector < pair <int,int > > G[NMax + 5];
priority_queue <pair<int,int>, vector <pair <int, int> >, greater <pair<int, int> > > Q;
int N,M;
int D[NMax + 5];
bool Use[NMax + 5];
void Read()
{
    fin >> N >> M;
    for(int i = 1; i <= M; ++i)
    {
        int x,y,c;
        fin >> x >> y >> c;
        G[x].push_back(make_pair(y,c));
    }
}

int FindMin()
{
    while(Use[Q.top().second])
        Q.pop();
    int Min = Q.top().second; Q.pop();
    return Min;
}

void Dijkstra()
{
    for(int i = 2; i <= N; ++i)
      D[i] = oo;

    for(int i = 1; i <= N; i++)
        Q.push(make_pair(D[i], i));

    for(int i = 1; i <= N; ++i)
    {
        int Nod = FindMin();

        Use[Nod] = true;
        for(auto i : G[Nod])
        {
            int Vecin = i.first, Cost = i.second;
            if(D[Nod] + Cost < D[Vecin])
            {
                D[Vecin] = D[Nod] + Cost;
                Q.push(make_pair(D[Vecin],Vecin));
            }
        }
    }
}

void Print()
{
    for(int i = 2; i <= N; ++i)
        if(D[i] == oo)
            D[i] = 0;
    for(int i = 2; i <= N; ++i)
        fout << D[i] << " ";
    fout <<"\n";
}

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