Cod sursa(job #2737761)

Utilizator inwursuIanis-Vlad Ursu inwursu Data 5 aprilie 2021 06:27:12
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 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 long long oo = static_cast<long long>(1e17);

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<long long> d(MAX_N);
vector<bool> inQ(MAX_N);


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


    d[s] = 0;
    inQ[s] = true;


    queue<int> Q;
    Q.push(s);
   

    while (Q.empty() == false)
    {
        int u = Q.front();
        Q.pop();
        inQ[u] = false;


        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;

                if (inQ[v] == false)
                {
                    Q.push(v);
                    inQ[v] = true;
                }
            }
        }
    }
}


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;
}