Cod sursa(job #2802693)

Utilizator redikusTiganus Alexandru redikus Data 18 noiembrie 2021 17:47:28
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.38 kb
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>

using namespace std;

class graf {

protected:
    int noduri, muchii;
    vector < vector < int >> adiacenta;

public:
    // Constructor cu matrice de adiacenta data
    graf(vector < vector < int >> listaAdiacenta, int noduri, int muchii): adiacenta(listaAdiacenta), noduri(noduri), muchii(muchii) {};

    // Constructor fara matrice de adiacenta, se cu initalizeaza una goala
    graf(int noduri, int muchii): adiacenta(noduri + 1), noduri(noduri), muchii(muchii) {};

    vector < int > bfs(int);
    int dfs();

};

class graf_neorientat : public graf{
private:
    void dfsbiconex(int, vector < int >&, vector < int >&, stack < pair < int, int >>&, int&, vector < string >&);
    void dfsCriticalConnections(int tata, vector < int >&, vector < int >&, int&, vector < vector < int >>&, vector < int >&);

public:
    graf_neorientat(vector < vector < int >> listaAdiacenta, int noduri, int muchii): graf(listaAdiacenta, noduri, muchii) {};
    graf_neorientat(int noduri, int muchii): graf(noduri, muchii) {};

    friend istream& operator>>(istream&, graf_neorientat&);

    vector < string > biconex();

    vector < vector < int >> criticalConnections();
};

class graf_neorientat_ponderat : public graf_neorientat {
    // Matrice de adianceta care contine si costurile
    vector< vector< pair< int, int >>> adiacentap;
public:
    graf_neorientat_ponderat(vector < vector < int >> listaAdiacenta, int noduri, int muchii): graf_neorientat(listaAdiacenta, noduri, muchii) {};
    graf_neorientat_ponderat(int noduri, int muchii): adiacentap(noduri+1), graf_neorientat(noduri, muchii) {};

    friend istream& operator>>(istream&, graf_neorientat_ponderat&);

    unordered_map<int, int> dijkstra();

};

istream& operator>>(istream& in, graf_neorientat_ponderat& g) {
    for (int i = 0; i < g.muchii; i++) {
        int aux1, aux2, aux3;
        in >> aux1 >> aux2 >> aux3;
        g.adiacentap[aux1].push_back(make_pair(aux2, aux3));
        g.adiacentap[aux2].push_back(make_pair(aux1, aux3));
    }
    return in;
}

unordered_map<int, int> graf_neorientat_ponderat :: dijkstra() {

    unordered_map<int, int> m;
    priority_queue<vector<int>> p;

    m[1] = 0;
    for(auto i : adiacentap[1]){
        p.push({-i.second, i.first, 1});
    }
    while(!p.empty()){
        vector<int> muchie = p.top();
        p.pop();
        int nod1 = muchie[1], nod2 = muchie[2], cost = -muchie[0];
        if(m.find(nod1) == m.end()){
            m[nod1] = m[nod2] + cost;
            for(auto i : adiacentap[nod1]){
                p.push({-i.second, i.first, nod1});
            }
        }
        else if(m.find(muchie[2]) == m.end()){
            m[nod2] = m[nod1] + cost;
            for(auto i : adiacentap[nod2]){
                p.push({-i.second, i.first, nod2});
            }
        }
    }
    return m;

}

void dijkstraDriver() {
    // https://infoarena.ro/problema/dijkstra
    // Citire
    ifstream in ("dijkstra.in");
    ofstream out("dijkstra.out");

    int n, m;
    in >> n >> m;

    graf_neorientat_ponderat x(n, m);
    in>>x;
    unordered_map<int, int> v = x.dijkstra();
    for(int i=2; i<=n; i++){
        out<<v[i]<<" ";
    }

}

int main() {
    // Se apeleaza functia corespunzatoare problemei
    dijkstraDriver();
    return 0;
}