Cod sursa(job #2683816)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 12 decembrie 2020 10:14:18
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#define INF 0x3f3f3f3f
#define NMAX 50005
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

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

struct elem{
    int nod, cost;

    bool operator<(const elem &other) const{
        if(cost != other.cost)
            return cost > other.cost;
        return nod > other.nod;
    }
};

int n, m;
int viz[NMAX], Dmin[NMAX];
vector<elem> graph[NMAX];
priority_queue<elem> Q;


void init()
{
    for(int i = 1; i <= n; ++i)
        Dmin[i] = INF;
}





void read()
{
    int x, y, c;

    f>>n>>m;
    init();

    for(int i = 0; i < m; ++i)
    {
        f>>x>>y>>c;
        graph[x].push_back({y, c});
    }
}

void dijkstra()
{
    Q.push({1, 0});
    Dmin[1] = 0;

    while(!Q.empty())
    {
        elem top = Q.top();
        Q.pop();
        if(viz[top.nod] == 1)
            continue;
        viz[top.nod] = 1;

        for(auto &v:graph[top.nod])
            if(viz[v.nod] == 0 && Dmin[v.nod] > Dmin[top.nod] + v.cost)
            {
                Dmin[v.nod] = Dmin[top.nod] + v.cost;
                Q.push({v.nod, Dmin[v.nod]});
            }
    }
}

void write()
{
    for(int i = 2; i<= n; ++i)
    {
        if(Dmin[i] >= INF)
            g<<0<<" ";
        else g<<Dmin[i]<<" ";
    }
}

int main()
{
    read();
    dijkstra();
    write();
    return 0;
}