Cod sursa(job #3335855)

Utilizator r0scatRosca Teodora Maia r0scat Data 23 ianuarie 2026 18:34:03
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
// alg dijkstra
// pe ce e folosit? --> grafuri ORIENTATE care pot CONTINE CICLURI si au doar ponderi POZITIVE 

// cum functioneaza??
// generalizare a algoritmului de bfs -> cand toate nodurile au distantele egale este chiar echivalent

// complexitate: O()

#include <iostream>
#include <fstream>
#include <bits/stdc++.h>

using namespace std;

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

int d[50001]; // costul drumului de la sursa la i
int tata[50001]; // tatal lui i pentru distanta curent salvata
int INF = 1e9;

vector<pair<int, int>> lista[50001];
stack<int> Q; // multimea vf neselectate

int main()
{
    int n, m;
    fin >> n >> m;

    for (int i = 1; i <= m; i++)
    {
        int x, y, c;
        fin >> x >> y >> c;

        // pt graf orientat
        lista[x].push_back({y, c});
    }

    // init
    for (int i = 1; i <= n; i++)
    {
        d[i] = INF;
        tata[i] = 0;
    }
    d[1] = 0; // start in 1

    Q.push(1);

    while (!Q.empty())
    {
        int nodTop = Q.top(); // u
        Q.pop();

        for (auto vecin : lista[nodTop]) // nodTop parintele vecinuluo
        {
            int nodVecin = vecin.first; // nod v
            int costVecin = vecin.second; // w(u, v) costul arcului (u,v)

            // "relaxarea" muchiei :)
            if (d[nodVecin] > d[nodTop] + costVecin) 
            {
                d[nodVecin] = d[nodTop] + costVecin;
                tata[nodVecin] = nodTop;
            }

            Q.push(nodVecin);
        }
    }

    for (int i = 2; i <= n; i++)
        fout << d[i] << " ";

    return 0;
}