Cod sursa(job #1706536)

Utilizator preda.andreiPreda Andrei preda.andrei Data 22 mai 2016 19:04:47
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

#define N_MAX 50000
#define INFINIT 0x3F3F3F3F

vector< pair<int, int> > ad[N_MAX + 1];
int distante[N_MAX + 1];
vector<bool> vizitat(N_MAX + 1);

bool cmpDistante(int a, int b);
void dijkstra(int start);

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

    int n, m, x, y, c;
    fin >> n >> m;

    for(int i = 2; i <= n; ++i)
        distante[i] = INFINIT;

    for(int i = 1; i <= m; ++i){
        fin >> x >> y >> c;
        ad[x].push_back(make_pair(y, c));
    }

    dijkstra(1);

    for(int i = 2; i <= n; ++i)
        fout << ((distante[i] == INFINIT) ? 0 : distante[i]) << " ";

    return 0;
}

void dijkstra(int start){
    priority_queue<int, vector<int>, decltype(&cmpDistante)> q(&cmpDistante);

    q.push(start);
    distante[start] = 0;
    vizitat[start] = true;

    while(!q.empty()){
        start = q.top();
        q.pop();

        for(auto vecin : ad[start]){
            if(distante[vecin.first] > distante[start] + vecin.second){
                distante[vecin.first] = distante[start] + vecin.second;
                if(!vizitat[vecin.first]){
                    q.push(vecin.first);
                    vizitat[vecin.first] = true;
                }
            }
        }
    }
}

bool cmpDistante(int a, int b){
    return distante[a] > distante[b];
}