Cod sursa(job #2566992)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 3 martie 2020 14:23:17
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;

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

const int NMAX=50050,inf=100000000;

int n,m;
int d[NMAX];
vector<pair<int,int> >lista[NMAX];
struct comparator{
    bool operator()(pair<int,int>a,pair<int,int>b){
        return a.second>b.second;
    }
};
bool folosit[NMAX];
priority_queue<pair<int,int>,vector<pair<int,int> >,comparator>q;
void citire()
{
    fin>>n>>m;
    int a,b,c;
    for (int i=1; i<=m; i++){
        fin>>a>>b>>c;
        lista[a].push_back(pair<int,int>(b,c));
    }
}
void dijkstra()
{
    for (int i=1; i<=n; i++)
        d[i]=inf;
    d[1]=0;
    q.push(pair<int,int>(1,0));
    pair<int,int> cont;
    while (!q.empty()){
        cont=q.top();
        q.pop();
        while (folosit[cont.first] && !q.empty()){
            cont=q.top();
            q.pop();
        }
        folosit[cont.first]=true;
        for (vector<pair<int,int> >::iterator it=lista[cont.first].begin(); it!=lista[cont.first].end(); it++){
            if (d[it->first]>d[cont.first]+it->second){
                d[it->first]=d[cont.first]+it->second;
                q.push(pair<int,int>(it->first,d[it->first]));
            }
        }
    }
}
int main()
{
    citire();
    dijkstra();
    for (int i=2; i<=n; i++){
        if (d[i]==inf)
            d[i]=0;
        fout<<d[i]<<' ';
    }
    fout<<'\n';
    return 0;
}