Cod sursa(job #2611508)

Utilizator RaduNichitaRadu Nichita RaduNichita Data 6 mai 2020 23:25:05
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.66 kb
// Copyright Radu Nichita 2020 [email protected] 	

#include <bits/stdc++.h>
#define NMAX 50009
#define kINF (1<<30)
#define NO_PARENT -1

using namespace std;
	
class Task {

    int N, M, source;;
    
    std::priority_queue<pair<int, int>, vector<pair<int, int>>,
                greater<pair<int, int>>> pq;
    
    std::vector<std::pair<int, int>> matrix[NMAX];
    std::vector<int> distances;
    std::vector<int> parent;

 
	
    void read_input() {
        int src, dst, cost;
        std::ifstream in("dijkstra.in");
        in >> N >> M; // dimensiune graf 
        distances = std::vector<int>(N + 1, kINF);
        for (int i = 1; i <= M; i++) {
            in >> src >> dst >> cost;
            matrix[src].push_back({cost, dst});
        }

        source = 1;

        in.close();
    }
	
 
	
    void getResult() {
        Dijkstra(source);
    }


    void Dijkstra(int source) {
        distances[source] = 0;
        parent = std::vector<int> (N + 1, 0);
        pq.push({distances[source], source});
        while (!pq.empty()) {
            auto top = pq.top();
            pq.pop();
            int cost = top.first;
            int node = top.second;
            if (cost > distances[node]) {
                continue;
            }
            for (auto const &neigh: matrix[node]) {
                int neighbour = neigh.second;
                int cost_edge = neigh.first;
                if (distances[neighbour] > distances[node] + cost_edge) {
                    distances[neighbour] = distances[node] + cost_edge;
                    parent[neighbour] = node;
                    pq.push({distances[neighbour], neighbour});
                }
            }
        }
    }
	
 
    std::vector<int> getRoad(int node) {
        std::vector<int> path;
        while (node != 0) {
            path.push_back(node);
            node = parent[node];
        }
        std::reverse(path.begin(), path.end());
        return path;
    } 

	
    void print() {
        std::ofstream out("dijkstra.out");   
        for (int i = 1; i <= N; i++) {
            if (i != source) {
                out<<(distances[i] == kINF ? 0 : distances[i])<<" ";
            }
        }
        out<<"\n";

        // for (int i = 2; i <=N; i++) {
        //     std::cout<<i<<": ";
        //     for (auto const &node : getRoad(i)) {
        //         std::cout<<node<<" ";
        //     }
        //     std::cout<<"\n";
        // }
        out.close();
        return;
    }
	
 
	
 public:
	
    void solve() {
        read_input();
        Dijkstra(source);
        print();
    }
	
 
	
};
	
 
	
int main() {

    Task* task = new Task();
	
    task->solve();
	
    delete(task);
	
 
	
    return 0;
	
}