Cod sursa(job #2270617)

Utilizator skoda888Alexandru Robert skoda888 Data 27 octombrie 2018 11:54:34
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <functional>
#include <climits>
#include <utility>

const int INF = INT_MAX;
int dist[50005];

struct compara
{
    bool operator()(int x, int y)
    {
        return dist[x] > dist[y];
    }
};

int main()
{
    std::ifstream in("dijkstra.in");
    std::ofstream out("dijkstra.out");

    int N;
    int M;
    in >> N >> M;

    std::vector< std::pair<int, int> > Graph[N + 1];
    for(int i = 1; i <= M; ++i){
        int nod1;
        int nod2;
        int cost;
        in >> nod1 >> nod2 >> cost;
        Graph[nod1].push_back(std::make_pair(nod2, cost));
    }

    //punctul de start este 1, conform problemei
    std::priority_queue< int, std::vector<int>, compara > pri_queue;

    for(int i = 1; i <= N; ++i){
        dist[i] = INF;
    }
    bool in_coada[N + 1];
    pri_queue.push(1);
    in_coada[1] = true;
    dist[1] = 0;

    while(!pri_queue.empty()){
        int nod_curr = pri_queue.top();
        pri_queue.pop();

        //std::cout << nod_curr;
        in_coada[nod_curr] = false;
        for(int j = 0; j < Graph[nod_curr].size(); ++j){
            int cost = Graph[nod_curr][j].second;
            int capat = Graph[nod_curr][j].first;
            int tmp = dist[nod_curr] + cost;
            if(dist[capat] > tmp){
                dist[capat] = tmp;
                if(!in_coada[capat]){
                    pri_queue.push(capat);
                    in_coada[capat] = true;
                }
            }
        }
    }

    for(int i = 2; i <= N; ++i){
        if(dist[i] == INF){
            out << 0 << ' ';
        }
        else{
            out << dist[i] << ' ';
        }
    }
    return 0;
}