Cod sursa(job #2205956)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 20 mai 2018 18:01:01
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <cstdio>

#define inf 0x3f3f3f3f
#define NMAX 50005

using namespace std;

int N, M;
vector< pair<int, int> > graf[NMAX];
int viz[NMAX];
int d[NMAX];

void citire()
{
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        graf[x].push_back(make_pair(y,c));
    }
}

void dijkstra()
{
    for(int i=2;i<=N;i++)
        d[i] = inf;

    priority_queue< pair< int, int> > q; ///-cost, nod
    q.push(make_pair(0,1));

    while(!q.empty())
    {
        int nod_curent = q.top().second;
        int cost_curent = -q.top().first;
        q.pop();

        if(viz[nod_curent])
            continue;
        viz[nod_curent] = 1;



        for(auto it : graf[nod_curent])
        {
            int vecin_curent = it.first;
            int cost_muchie = it.second;
            if(!viz[vecin_curent] && d[nod_curent] + cost_muchie < d[vecin_curent])
            {
                d[vecin_curent] = d[nod_curent] + cost_muchie;
                q.push(make_pair(-d[vecin_curent], vecin_curent));
            }
        }
    }
}

int main()
{
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    citire();
    dijkstra();

    for(int i=2;i<=N;i++)
        if(d[i] != inf)
            printf("%d ",d[i]);
        else
            printf("0 ");

    return 0;
}