Cod sursa(job #3265831)

Utilizator tMario2111Neagu Mario tMario2111 Data 3 ianuarie 2025 17:12:11
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <vector>
#include <set>
#include <fstream>

using namespace std;

const int NMAX = 1e5;
const long long INF = 1e18;

vector<pair<int, int>> G[NMAX + 1];
long long d[NMAX + 1];
int vis[NMAX + 1];
int p[NMAX + 1];

int main()
{
    ifstream f("dijkstra.in");
    ofstream g("dijkstra.out");
    int n, m;
    f >> n >> m;
    for (int i = 1; i <= m; ++i)
    {
        int x, y, c;
        f >> x >> y >> c;
        G[x].push_back({ y, c });
    }
    for (int i = 1; i <= n; ++i)
        d[i] = INF;
    d[1] = 0;
    set<pair<long long, int>> s; // (distanta, nod)
    s.insert({ d[1], 1 });
    int nc = 0;
    while (!s.empty())
    {
        if (nc == n - 1)
            break;
        auto it = s.begin();
        int node = (*it).second;
        s.erase(it);
        if (vis[node])
            continue;
        vis[node] = 1;
        nc++;
        for (auto next : G[node])
        {
            int vecin = next.first;
            int cost_muchie = next.second;
            if (d[vecin] > d[node] + cost_muchie)
            {
                d[vecin] = d[node] + cost_muchie;
                p[vecin] = node;
                s.insert({ d[vecin], vecin });
            }
        }
    }

    // long long maxim = 0;
    // for (int i = 2; i <= n; ++i)
    //     maxim = max(maxim, d[i]);
    // for (int i = 2; i <= n; ++i)
    //     if (d[i] == maxim)
    //         cout << i << ' ';
    for (int i = 2; i <= n; ++i)
        if (d[i] == INF)
            g << "0 ";
        else
            g << d[i] << ' ';
    return 0;
}