Pagini recente » Cod sursa (job #2762470) | Cod sursa (job #2936750) | Cod sursa (job #2538454) | Cod sursa (job #2282250) | Cod sursa (job #2193680)
#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;
}