Cod sursa(job #2669454)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 7 noiembrie 2020 00:11:56
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

typedef pair < int, int > PII;

const int NMAX = 5e4 + 1;
const int INF = 1e9;

int N, M;

vector < PII > G[NMAX];

int d[NMAX];
bool Sel[NMAX];

static inline void Read ()
{
    f.tie(nullptr);

    f >> N >> M;

    for(int i = 1; i <= M; ++i)
    {
        int X = 0, Y = 0, C = 0;
        f >> X >> Y >> C;

        G[X].push_back({C, Y});
    }

    return;
}

static inline void Initialize ()
{
    for(int i = 1; i <= N; ++i)
        d[i] = INF, Sel[i] = 0;

    return;
}

static inline void Load (int Node)
{
    for(auto it : G[Node])
        d[it.second] = it.first;

    return;
}

static inline void Dijkstra (int Chosen)
{
    Initialize();

    d[Chosen] = 0, Sel[Chosen] = 1;

    Load(Chosen);

    int free = (N - 1);

    while(free)
    {
        int Node = 0, Min = INF;

        for(int i = 1; i <= N; ++i)
            if(!Sel[i] && d[i] < Min)
                Min = d[i], Node = i;

        Sel[Node] = 1, --free;

        for(auto it : G[Node])
        {
            int new_cost = d[Node] + it.first;
            int adj = it.second;

            if(new_cost < d[adj])
                d[adj] = new_cost;
        }
    }

    return;
}

static inline void Write ()
{
    for(int i = 2; i <= N; ++i)
    {
        g << ((d[i] != INF) ? d[i] : 0);

        if(i != N)
            g << ' ';
    }

    g << '\n';

    return;
}

int main()
{
    Read();

    Dijkstra(1);

    Write();

    return 0;
}