Cod sursa(job #2646064)

Utilizator Rares31100Popa Rares Rares31100 Data 30 august 2020 17:36:04
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
#define PLI pair<long long, int>
#define INF 5000000001

using namespace std;

ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
int n, m, vf[250001], cost[250001], last[50001], urm[250001];
long long rez[50001];
priority_queue <PLI, vector<PLI>, greater<PLI>> q;
bitset <50001> viz;

int nr;
void adauga(int from, int to, int ct)
{
    vf[++nr] = to;
    cost[nr] = ct;
    urm[nr] = last[from];
    last[from] = nr;
}

int main()
{
    in >> n >> m;
    
    for(int i = 1, from, to, ct; i <= m; i++)
    {
        in>>from>>to>>ct;
        adauga(from, to, ct);
    }
    
    for(int i = 2; i <= n; i++)
        rez[i] = INF;
    
    q.push({0,1});
    
    while(!q.empty())
    {
        while( !q.empty() && viz[q.top().second] )
            q.pop();
        
        if(q.empty())
            break;
        
        int nod = q.top().second;
        q.pop();
        viz[nod] = 1;
        
        for(int k = last[nod]; k != 0; k = urm[k])
        {
            int nod2 = vf[k]; 
            long long ct = cost[k];
            
            if( rez[nod]+ct < rez[nod2] )
            {
                rez[nod2] = rez[nod]+ct;
                q.push({rez[nod2], nod2});
            }
        }
    }
    
    for( int i = 2; i <= n; i++ )
        if(rez[i] == INF)
            out << 0 << ' ';
        else
            out << rez[i] << ' ';
            
    return 0;
}