Cod sursa(job #1958712)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 8 aprilie 2017 17:39:53
Problema Algoritmul lui Dijkstra Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <vector>
#include <queue>
 
using namespace std;
 
const long long N = 50005;
const long long inf = (1 << 30);
 
long long n, m;
vector<pair<long long, long long> > vecini[N];
priority_queue<pair<long long, long long>, vector<pair<long long, long long> >, greater<pair<long long, long long> > > Q;
long long viz[N];
 
void citire()
{
    scanf("%lld %lld", &n, &m);
 
    long long tmp1, tmp2, tmp3;
 
    for(long long i = 1; i <= m; i++)
    {
        scanf("%lld %lld %lld", &tmp1, &tmp2, &tmp3);
         
        vecini[tmp1].push_back(make_pair(tmp3, tmp2));
        viz[i] = inf;
    }
}
 
void solve()
{
    Q.push(make_pair(0, 1));
    viz[1] = 0;
 
    while(Q.empty() == false)
    {
        long long x = Q.top().second;
        Q.pop();
 
        long long l = vecini[x].size();
 
        for(long long i = 0; i < l; i++)
        {
            if(viz[vecini[x][i].second] > viz[x] + vecini[x][i].first)
            {
                viz[vecini[x][i].second] = viz[x] + vecini[x][i].first;
                Q.push(vecini[x][i]);
            }
        }
    }
}
 
void afisare()
{
    for(long long i = 2; i <= n; i++)
    {
        if(viz[i] == inf)
        {
            printf("0 ");
            continue;
        }
 
        printf("%lld ", viz[i]);
    }
}
 
int main()
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
 
    citire();
    solve();
    afisare();
 
    return 0;
}