Cod sursa(job #2173279)

Utilizator RoliBoyNagy Roland RoliBoy Data 15 martie 2018 21:28:39
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#include <climits>

using namespace std;

struct edge { int to, length; };
    
int dijkstra(const vector< vector<edge> > &graph, int source, int target) {
    vector<int> min_distance( graph.size(), INT_MAX );
    min_distance[ source ] = 0;
    set< pair<int,int> > active_vertices;
    active_vertices.insert( {0,source} );
        
    while (!active_vertices.empty()) {
        int where = active_vertices.begin()->second;
        if (where == target) return min_distance[where];
        active_vertices.erase( active_vertices.begin() );
        for (auto ed : graph[where]) 
            if (min_distance[ed.to] > min_distance[where] + ed.length) {
                active_vertices.erase( { min_distance[ed.to], ed.to } );
                min_distance[ed.to] = min_distance[where] + ed.length;
                active_vertices.insert( { min_distance[ed.to], ed.to } );
            }
    }
    return INT_MAX;
}

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

    int nodes, edges;
    in >> nodes >> edges;

    std::vector<std::vector<edge>> graph(nodes, std::vector<edge>());

    while (edges--) {
        int x, y, w;
        in >> x >> y >> w;
        graph[x-1].push_back({y-1, w});
    }

    for (int i = 1; i < nodes; i++) {
        out << dijkstra(graph, 0, i) << " ";
    }
}