Cod sursa(job #2554136)

Utilizator AlbertUngureanuAlbert AlbertUngureanu Data 22 februarie 2020 16:55:56
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>
#define INF 1000000000

using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

int N,M;
int Cost[50001];
unsigned Grad[50001];
bool Viz[50001];
vector< pair<int,int> >Ad[50001];

void citire()
{
    int x,y,z;
    fin>>N>>M;
    for(int i=1;i<=N;i++)
        Cost[i]=INF;
    for(int i=1;i<=M;i++)
    {
        fin>>x>>y>>z;
        Ad[x].push_back({y,z});
        Grad[x]++;
    }
}

void dijkstra(int x)
{
    priority_queue< pair<int,int> >Q;
    int P;
    Cost[x]=0;
    Q.push({0,x});
    while(!Q.empty())
    {
        P=Q.top().second;
        Q.pop();
        if(!Viz[P])
        {
            Viz[P]=1;
            for(unsigned i=0;i<Grad[P];i++)
                if(Cost[Ad[P][i].first]>Cost[P]+Ad[P][i].second)
                {
                    Cost[Ad[P][i].first]=Cost[P]+Ad[P][i].second;
                    Q.push({-Cost[Ad[P][i].first],Ad[P][i].first});
                }
        }
    }
}

void afisare()
{
    for(int i=2;i<=N;i++)
        if(Cost[i]==INF)
            fout<<0<<" ";
        else
            fout<<Cost[i]<<" ";
}

int main()
{
    citire();
    dijkstra(1);
    afisare();
    return 0;
}