Cod sursa(job #3236669)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 30 iunie 2024 10:53:22
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>

using namespace std;
using edge = pair<int, int>;

static constexpr int nMAX = ((int)(5e4) + 1);
static constexpr int INF = ((int)(1e9));

int n;
vector<edge> G[nMAX];

int d[nMAX];
bool vizited[nMAX];

static inline void add_edge(const int x, const int y, const int c)
{
    G[x].push_back({c, y});
    return;
}

static inline void read()
{
    ifstream f("dijkstra.in");
    f.tie(nullptr);

    f >> n;
    int m = 0;
    f >> m;

    int u = 0, v = 0, c = 0;

    for (int i = 1; i <= m; ++i)
        f >> u >> v >> c, add_edge(u, v, c);

    return;
}

static inline void init()
{
    for (int i = 1; i <= n; ++i)
        d[i] = INF, vizited[i] = false;

    return;
}

static inline void dijkstra(const int S)
{
    init();

    d[S] = 0;

    int min_node = 0, min_dist = 0;

    for (int i = 1; i <= n; ++i)
    {
        min_node = -1, min_dist = INF;

        for (int j = 1; j <= n; ++j)
            if (!vizited[j])
                if (d[j] < min_dist)
                    min_node = j, min_dist = d[j];

        if (min_node == -1)
            break;

        vizited[min_node] = true;
        for (const edge &x : G[min_node])
            if (!vizited[x.second])
                if ((x.first + d[min_node]) < d[x.second])
                    d[x.second] = (x.first + d[min_node]);
    }

    return;
}

int main()
{
    read();

    dijkstra(1);

    ofstream g("dijkstra.out");
    g.tie(nullptr);

    for (int i = 2; i <= n; ++i)
    {
        g << ((d[i] == INF) ? 0 : d[i]);

        if (i != n)
            g << ' ';
        else
            g << '\n';
    }

    return 0;
}