Pagini recente » Cod sursa (job #729281) | Cod sursa (job #3258901) | Cod sursa (job #1232681) | Cod sursa (job #3245808) | Cod sursa (job #2518246)
// Example program
#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
// i dont like the broken symmetry
struct EdgeInfo {
int b, w;
EdgeInfo() {}
EdgeInfo(int b, int w): b(b), w(w) {}
};
class Graph {
public:
Graph(int V, int E): V(V), E(E), adj_list(V + 1) {}
void add_edge(int a, int b, int w) {
adj_list[a].push_back(EdgeInfo(b, w));
}
// public only bc i need them and i dont know about getters yet
const int V, E;
vector< vector<EdgeInfo> > adj_list;
};
void dijkstra(Graph& g) {
int source = 1;
vector<int> dist(g.V + 1, numeric_limits<int>::max());
dist[source] = 0;
priority_queue<pair<int, int>> q;
q.push({0, source});
while (!q.empty()) {
int node;
const pair<int, int> &p = q.top();
node = p.second;
q.pop();
for (int i = 0; i < g.adj_list[node].size(); i++) {
EdgeInfo& ei = g.adj_list[node][i];
if (dist[ei.b] > dist[node] + ei.w) {
dist[ei.b] = dist[node] + ei.w;
q.push({-dist[ei.b], ei.b});
}
}
}
for (int i = 2; i < dist.size(); i++) {
if (dist[i] == numeric_limits<int>::max())
dist[i] = 0;
cout << dist[i] << " ";
}
cout << endl;
}
int main() {
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
int V, E, a, b, w;
cin >> V;
cin >> E;
Graph g(V, E);
for (int i = 0; i < E; i++) {
cin >> a;
cin >> b;
cin >> w;
g.add_edge(a, b, w);
}
dijkstra(g);
return 0;
}