Cod sursa(job #1419094)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 14 aprilie 2015 18:25:37
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <limits>

#define MAXN 50001

#define Inf numeric_limits<int>::max()

using namespace std;
using Graph = vector<vector<pair<int, int> > >;

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

vector<int> distances(MAXN, Inf);
int N, M;

struct Comparator 
{
    bool operator() (const int& x, const int& y) const
    {
        return distances[x] > distances[y];
    }
};

void find_min_road(Graph& G, int source)
{
    priority_queue<int, vector<int>, Comparator> Q;
    
    Q.push(source);
    distances[source] = 0;

    while (Q.size()) {
        int currNode = Q.top();
        Q.pop();

        for (auto &node : G[currNode]) {
            if (distances[currNode] + node.second < distances[node.first]) {
                distances[node.first] = distances[currNode] + node.second;
                Q.push(node.first);
            }
        }
    }
}

int main()
{
    in >> N >> M;

    Graph G(N + 1);
    int x, y, c;
    for (int i = 1; i <= M; i++) {
        in >> x >> y >> c;
        G[x].push_back(make_pair(y, c));
    }

    find_min_road(G, 1);

    for (int i = 2; i <= N; i++)
        (distances[i] == Inf) ? out << "0 " : out << distances[i] << " ";

    out << '\n';

    return 0;
}