Cod sursa(job #2417368)

Utilizator hiimsobaDicianu Ioan-Alexandru hiimsoba Data 29 aprilie 2019 16:49:46
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

#define inf 1 << 30

int extractMin(std::vector<int>& c, std::vector<bool>& v) {
    int node = -1;
    int min = inf;
    for (size_t i = 1; i < c.size(); i++) {
        if (!v[i] && c[i] < min) {
            min = c[i];
            node = i;
        }
    }
    return node;
}

std::vector<int> dijkstra(std::vector<std::vector<int>>& Graph, int startNode) {
    std::vector<bool> visited(Graph.size(), false);
    std::vector<int> costs(Graph.size(), inf);

    costs[startNode] = 0;

    for (size_t i = 1; i < Graph.size(); i++) {
        int node = extractMin(costs, visited);
        visited[node] = true;
        for (size_t j = 1; j < Graph[node].size(); j++) {
            if (!visited[j] && Graph[node][j] && costs[j] > costs[node] + Graph[node][j]) {
                costs[j] = costs[node] + Graph[node][j];
            }
        }
    }

    return costs;
}

int main() {
    std::ifstream f("dijkstra.in");
    int V, E;
    f >> V >> E;
    std::vector<std::vector<int>> Graph(V + 1, std::vector<int> (V + 1, 0));
    for (int i = 0; i < E; ++i) {
        int x, y, w;
        f >> x >> y >> w;
        Graph[x][y] = Graph[y][x] = w;
    }
    f.close();

    auto res = dijkstra(Graph, 1);

    std::ofstream g("dijkstra.out");
    for (size_t i = 2; i < res.size(); i++) {
        g << res[i] << ' ';
    }
    g.close();

//    std::for_each(Graph.begin() + 1, Graph.end(), [] (std::vector<int>& line) {std::for_each(line.begin() + 1, line.end(), [] (int& w) {std::cout << w << ' ';}); std::cout << '\n';});
    return 0;
}