Cod sursa(job #2536283)

Utilizator ionita786Ionita Daniel ionita786 Data 1 februarie 2020 18:39:13
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define Nmax 10e8
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
typedef pair <int,int> pint;
priority_queue < pint,vector <pint>, greater<pint> > q;
int n,m,a,b,c;
int main()
{
    in >> n >> m;
    vector <pint> nodes[n+1];
    vector <int> dp(n+1,Nmax);
    vector <bool> viz(n+1);
    for(int i = 1; i <= m; ++i)
    {
        in >> a >> b >> c;
        nodes[a].push_back({c,b});
    }
    dp[1] = 0;
    for(auto i : nodes[1])
    {
        q.push(i);
        dp[i.second] = i.first;
    }
    viz[1] = 1;
    while(!q.empty())
    {
        while(!q.empty() && viz[q.top().second])
            q.pop();
        if(!q.empty())
        {
            int node = q.top().second;
            viz[node] = 1;
            q.pop();
            for(auto i : nodes[node])
            {
                int cost = i.first,newnode = i.second;
                if(dp[node] + cost < dp[newnode])
                {
                    dp[newnode] = dp[node] + cost;
                    q.push({dp[newnode],newnode});
                }
            }
        }
    }
    for(int i = 2; i <= n; ++i)
    {
        (dp[i] == Nmax ? out << 0 : out << dp[i]);
        out << " ";
    }
    return 0;
}