Cod sursa(job #2132698)

Utilizator mateidanutDanut Gabriel Matei mateidanut Data 15 februarie 2018 23:18:30
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 0x7fffffff
#define NMAX (50000 + 3)
#define MMAX (100000 + 3)
using namespace std;

class Neighbor {
public:
    int index;
    int cost;

    Neighbor(int i, int c) : index(i), cost(c) {};
};

class Compare {
public:
    bool operator()(Neighbor a, Neighbor b) {
        return a.cost > b.cost;
    }
};

int main() {

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

    int n, m;

    vector<Neighbor> neighbors[NMAX];

    int distance[NMAX];

    int i, j;
    f >> n >> m;

    for (i = 1; i <= n; ++i) {
        distance[i]= INF;
    }

    for (; m; --m) {
        int x, y, c;

        f >> x >> y >> c;

        neighbors[x].push_back(Neighbor(y, c));
        neighbors[y].push_back(Neighbor(x, c));
    }

    int source = 1;

    distance[source] = 0;
    priority_queue< Neighbor, vector<Neighbor>, Compare> unvisited;
    unvisited.push(Neighbor(source, 0));

    while (!unvisited.empty()) {
        Neighbor node = unvisited.top();
        unvisited.pop();
        for (const auto &neighbr : neighbors[node.index]) {
            if (distance[neighbr.index] == INF || distance[node.index] + neighbr.cost < distance[neighbr.index]) {
                distance[neighbr.index] = distance[node.index] + neighbr.cost;
                unvisited.push(Neighbor(neighbr.index, distance[neighbr.index]));
            }
        }
    }

    for (i = 2; i <= n; ++i) {
        g << distance[i] << " ";
    }

    return 0;
}