Cod sursa(job #2193682)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 10 aprilie 2018 22:04:57
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <cassert>
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF (2e9)

using namespace std;

class Graph{
    private:
        int n, m;
        vector< vector< pair< int, int > > > G;
    public:
        int getN();
        int getM();
        vector< pair< int, int > >& operator[](int);

        friend istream& operator>>(istream& , Graph&);
};

int Graph::getN() {
    return n;
}

int Graph::getM() {
    return m;
}

vector< pair< int, int > >& Graph::operator[](const int i) {
    assert(i >= 1 && i <= n);

    return G[i];
}

istream& operator>>(istream& in, Graph& obj) {
    in >> obj.n >> obj.m;
    obj.G.reserve(obj.n + 1);
    obj.G.resize(obj.n + 1);
    int x, y, z;
    for (int i = 0; i < obj.m; ++i) {
        in >> x >> y >> z;
        obj.G[x].push_back(make_pair(y, z));
    }
    return in;
}

class Dijkstra{
    private:
        int n, m;
        int *tata, *d;
    public:
        explicit Dijkstra(Graph& G);
        ~Dijkstra();

        friend ostream& operator<<(ostream& , const Dijkstra&);
};

Dijkstra::Dijkstra(Graph& A) {
    n = A.getN();
    m = n - 1;
    d = new int[n + 1];
    tata = new int[n + 1];
    auto viz = new int[n + 1];
    fill(viz, viz + n + 1, 0);
    int start = 1;
    for (int i = 1; i <= n ; ++i) {
        d[i] = INF;
    }
    d[start] = 0;
    vector<int> S;
    priority_queue< pair<int, int>, vector< pair<int, int> >, greater< pair<int, int> > > Q;
    Q.push(make_pair(d[start], start));
    while (!Q.empty()) {
        int u = Q.top().second;
        S.push_back(u);
        Q.pop();
        viz[u] = 1;
        for (int i = 0; i < A[u].size(); i++) {
            int v = A[u][i].first;
            int Wuv = A[u][i].second;
            if (!viz[v] && d[v] > d[u] + Wuv) {
                d[v] = d[u] + Wuv;
                Q.push(make_pair(d[v], v));
            }
        }
        //if(S.size() == n)
          //  break;
    }
}

Dijkstra::~Dijkstra() {
    delete[] d;
    delete[] tata;
}

ostream& operator<<(ostream& out, const Dijkstra& obj) {
    for(int i = 2; i <= obj.n; ++i)
        (obj.d[i] != INF) ? out << obj.d[i] << ' ' : out << 0 << ' ';
    return out;
}

int main() {
    ifstream fin("dijkstra.in");
    if(!fin.is_open()) {
        cout << "The file can't be opened!\n";
        exit(EXIT_FAILURE);
    }

    Graph G;
    fin >> G;
    //cout << G.G[1][0].first;
    Dijkstra D(G);

    ofstream fout("dijkstra.out");
    if(!fout.is_open()) {
        cout << "The file can't be opened!\n";
        exit(EXIT_FAILURE);
    }

    fout << D << '\n';

    fin.close();
    fout.close();
    return 0;
}