Cod sursa(job #2737764)

Utilizator inwursuIanis-Vlad Ursu inwursu Data 5 aprilie 2021 07:23:09
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <functional>
#include <tuple>

using namespace std;

const int MAX_N = 50000 + 1;
const int MAX_M = 250000 + 1;
const int oo = static_cast<int>(1e9);

ifstream fin{ "dijkstra.in" };
ofstream fout{ "dijkstra.out" };


vector<vector<tuple<int, int>>> adj(MAX_N, vector<tuple<int, int>>());
int N, M;
int s;


vector<int> d(MAX_N);


void Dijkstra()
{
    for (int u = 1; u <= N; ++u)
    {
        d[u] = oo;
    }

    d[s] = 0;


    priority_queue<tuple<int, int>, vector<tuple<int, int>>, greater<tuple<int, int>>> Q;

    Q.push({ d[s], s });


    while (Q.empty() == false)
    {
        tuple<long long, int> top = Q.top();
        Q.pop();

        long long dist = get<0>(top);
        int u = get<1>(top);


        if (dist > d[u]) continue;


        for (auto& edge : adj[u])
        {
            int v = get<0>(edge);
            int weight = get<1>(edge);

            if (d[u] + weight < d[v])
            {
                d[v] = d[u] + weight;


                Q.push({ d[v], v });
            }
        }


    }
}


int main()
{
    fin >> N >> M;

    for (int i = 1; i <= M; ++i)
    {
        int u, v, weight;

        fin >> u >> v >> weight;

        adj[u].push_back({ v, weight });
    }


    s = 1;

    Dijkstra();


    for (int u = 2; u <= N; ++u)
    {
        if (d[u] == oo)
        {
            fout << 0 << " ";
        }
        else
        {
            fout << d[u] << " ";
        }
    }

    fout << endl;
}