Cod sursa(job #2461244)

Utilizator AndreiJJIordan Andrei AndreiJJ Data 25 septembrie 2019 10:43:29
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <set>
#include <vector>
#include <cstring>
#define pb push_back

using namespace std;

const int N = 50005, oo = 1e9;

int n, dist[N];
vector <pair<int, int> > L[N];
set <pair<int, int> > s;

void Read ()
{
    int m;
    ifstream fin ("dijkstra.in");
    fin >> n >> m;
    int i, x, y, cost;
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y >> cost;
        L[x].pb({y, cost});
    }
}

void Dijkstra ()
{
    for (int i = 2; i <= n; i++)
        dist[i] = oo;
    s.insert({1, 0});
    while (!s.empty())
    {
        int x = s.begin() -> first;
        int d = s.begin() -> second;
        s.erase(s.begin());
        if (L[x].size())
            for (auto i : L[x])
                {
                    if (dist[i.first] > d + i.second)
                    {
                        if (dist[i.first] != oo)
                            s.erase(s.find({i.first, dist[i.first]}));
                        dist[i.first] = d + i.second;
                        s.insert({i.first, dist[i.first]});
                    }
                }
    }
    ofstream fout ("dijkstra.out");
    for (int i = 2; i <= n; i++)
    {
        if (dist[i] == oo) dist[i] = 0;
        fout << dist[i] << " ";
    }
}

int main()
{
    Read();
    Dijkstra();
    return 0;
}