Pagini recente » Cod sursa (job #743147) | Cod sursa (job #1633392) | Cod sursa (job #412859) | Cod sursa (job #1449929) | Cod sursa (job #3216879)
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
std::ifstream f("rucsac.in");
std::ofstream g("rucsac.out");
class Edge {
public:
long long source;
long long dest;
long long cost;
Edge() : source(0), dest(0) {}
Edge(long long _s) : source(-1), dest(_s), cost(0) {}
Edge(long long _source, long long _dest, long long _cost) : source(_source), dest(_dest), cost(_cost) {}
// bool operator< (const Edge& other) {
// return this->cost < other.cost;
// }
};
class EdgeComparator {
public:
bool operator()(Edge a, Edge b) {
return a.cost > b.cost;
}
};
class Graph {
public:
long long nodes;
std::vector < std::vector<Edge *> > graph;
Graph(long long n) {
for (int i = 0 ; i < 1 + n ; ++i)
graph.push_back(std::vector<Edge *>());
nodes = n;
}
void addEdge(long long s, long long d, long long c) {
Edge *e1 = new Edge(s, d, c);
graph[s].push_back(e1);
}
};
std::vector<int> dijkstra(Graph g, long long source, long long dest) {
std::priority_queue<Edge, std::vector<Edge>, EdgeComparator> pq;
std::vector<int> viz(g.nodes + 1, 0);
std::vector<int> dist(g.nodes + 1, 1e9);
std::vector<int> bef(g.nodes + 1, 0);
pq.push(Edge(source));
dist.at(source) = 0;
while(!pq.empty()) {
Edge curr = pq.top();
pq.pop();
long long node = curr.dest;
viz.at(node) = 2;
for (auto& edge : g.graph[node]) {
long long neigh = edge->dest;
if (viz[neigh] == 0 && dist.at(neigh) > dist.at(node) + edge->cost) {
pq.push(*edge);
viz.at(neigh) = 1;
dist.at(neigh) = dist.at(node) + edge->cost;
bef.at(neigh) = node;
}
}
}
return dist;
}
template <typename T>
void logvec(std::vector<T> vec, int offset = 0) {
for (int i = offset; i < vec.size(); ++i) {
g << vec[i] << " ";
}
g << "\n";
}
int main() {
int n, m, so = 1, de;
f >> n >> m;
Graph g(n);
for (int i = 0; i < m ; ++i) {
int s, d, c;
f >> s >> d >> c;
g.addEdge(s, d, c);
}
logvec(dijkstra(g, so, de), 2);
}