Cod sursa(job #2559212)

Utilizator denismoldovanDenis Moldovan denismoldovan Data 27 februarie 2020 09:41:37
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

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

#define cin fin
#define cout fout

const int Nmax=50001;
const int infinit=INT_MAX/2-1;

int n,m;
int x,y,c;
int d[Nmax];
bitset <Nmax> viz;
vector < pair<int,int> >g[Nmax];
struct comp
{
        bool operator()(int x, int y){
            return d[x]>d[y];
        }
};
priority_queue <int, vector <int>, comp > coada;

void read(){
    cin>>n>>m;
    while (m--){
        cin>>x>>y>>c;
        g[x].push_back(make_pair(y,c));
        g[y].push_back(make_pair(x,c));
    }
}
void solve(int inceput){
    for (int i=1; i<=n; i++)
        d[i]=infinit;

    d[inceput]=0;
    coada.push(inceput);
    viz[inceput]=true;

    while (!coada.empty()){
        int nodCurent=coada.top();
        coada.pop();
        viz[nodCurent]=false;

        for (int i=0; i<g[nodCurent].size(); i++)
        {
            int vecin=g[nodCurent][i].first;
            int cost=g[nodCurent][i].second;

            if (d[nodCurent]+cost<d[vecin])
            {
                d[vecin]=d[nodCurent]+cost;
                if (viz[vecin]==false)
                {
                    coada.push(vecin);
                    viz[vecin]=true;
                }
            }
        }
    }
}
void afis(int inceput){
    for (int i=1; i<=n; i++){
        if (d[i]!=infinit)
            cout<<d[i]<<" ";
        else cout<<0<<" ";
    }
}
int main()
{
   read();
   solve(1);
   afis(1);
    return 0;
}