#include <iostream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;
const int INF = numeric_limits<int>::max();
vector<int> dijkstra(int start, const vector<vector<pair<int, int>>>& graph) {
int n = graph.size();
vector<int> dist(n, INF);
dist[start] = 0;
// Kolejka priorytetowa (dystans, wierzchołek)
priority_queue<
pair<int, int>,
vector<pair<int, int>>,
greater<pair<int, int>>
> pq;
pq.push({0, start});
while (!pq.empty()) {
auto [currentDist, u] = pq.top();
pq.pop();
// Jeśli istnieje lepsza droga – pomijamy
if (currentDist > dist[u]) continue;
// Przegląd sąsiadów
for (auto [v, weight] : graph[u]) {
int newDist = currentDist + weight;
if (newDist < dist[v]) {
dist[v] = newDist;
pq.push({newDist, v});
}
}
}
return dist;
}
int main() {
// Przykładowy graf (skierowany)
// Każdy element to: (sąsiad, waga)
vector<vector<pair<int, int>>> graph = {
{{1, 1}, {2, 4}}, // 0 -> 1 (1), 0 -> 2 (4)
{{2, 2}, {3, 5}}, // 1 -> 2 (2), 1 -> 3 (5)
{{3, 1}}, // 2 -> 3 (1)
{} // 3
};
int start = 0;
vector<int> distances = dijkstra(start, graph);
cout << "Najkrotsze odleglosci od wierzcholka " << start << ":\n";
for (int i = 0; i < distances.size(); i++) {
if (distances[i] == INF)
cout << i << ": INF\n";
else
cout << i << ": " << distances[i] << "\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxsaW1pdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IElORiA9IG51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwoKdmVjdG9yPGludD4gZGlqa3N0cmEoaW50IHN0YXJ0LCBjb25zdCB2ZWN0b3I8dmVjdG9yPHBhaXI8aW50LCBpbnQ+Pj4mIGdyYXBoKSB7CiAgICBpbnQgbiA9IGdyYXBoLnNpemUoKTsKICAgIHZlY3RvcjxpbnQ+IGRpc3QobiwgSU5GKTsKICAgIGRpc3Rbc3RhcnRdID0gMDsKCiAgICAvLyBLb2xlamthIHByaW9yeXRldG93YSAoZHlzdGFucywgd2llcnpjaG/FgmVrKQogICAgcHJpb3JpdHlfcXVldWU8CiAgICAgICAgcGFpcjxpbnQsIGludD4sCiAgICAgICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiwKICAgICAgICBncmVhdGVyPHBhaXI8aW50LCBpbnQ+PgogICAgPiBwcTsKCiAgICBwcS5wdXNoKHswLCBzdGFydH0pOwoKICAgIHdoaWxlICghcHEuZW1wdHkoKSkgewogICAgICAgIGF1dG8gW2N1cnJlbnREaXN0LCB1XSA9IHBxLnRvcCgpOwogICAgICAgIHBxLnBvcCgpOwoKICAgICAgICAvLyBKZcWbbGkgaXN0bmllamUgbGVwc3phIGRyb2dhIOKAkyBwb21pamFteQogICAgICAgIGlmIChjdXJyZW50RGlzdCA+IGRpc3RbdV0pIGNvbnRpbnVlOwoKICAgICAgICAvLyBQcnplZ2zEhWQgc8SFc2lhZMOzdwogICAgICAgIGZvciAoYXV0byBbdiwgd2VpZ2h0XSA6IGdyYXBoW3VdKSB7CiAgICAgICAgICAgIGludCBuZXdEaXN0ID0gY3VycmVudERpc3QgKyB3ZWlnaHQ7CgogICAgICAgICAgICBpZiAobmV3RGlzdCA8IGRpc3Rbdl0pIHsKICAgICAgICAgICAgICAgIGRpc3Rbdl0gPSBuZXdEaXN0OwogICAgICAgICAgICAgICAgcHEucHVzaCh7bmV3RGlzdCwgdn0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBkaXN0Owp9CgppbnQgbWFpbigpIHsKICAgIC8vIFByenlrxYJhZG93eSBncmFmIChza2llcm93YW55KQogICAgLy8gS2HFvGR5IGVsZW1lbnQgdG86IChzxIVzaWFkLCB3YWdhKQogICAgdmVjdG9yPHZlY3RvcjxwYWlyPGludCwgaW50Pj4+IGdyYXBoID0gewogICAgICAgIHt7MSwgMX0sIHsyLCA0fX0sICAgICAvLyAwIC0+IDEgKDEpLCAwIC0+IDIgKDQpCiAgICAgICAge3syLCAyfSwgezMsIDV9fSwgICAgIC8vIDEgLT4gMiAoMiksIDEgLT4gMyAoNSkKICAgICAgICB7ezMsIDF9fSwgICAgICAgICAgICAgLy8gMiAtPiAzICgxKQogICAgICAgIHt9ICAgICAgICAgICAgICAgICAgICAvLyAzCiAgICB9OwoKICAgIGludCBzdGFydCA9IDA7CiAgICB2ZWN0b3I8aW50PiBkaXN0YW5jZXMgPSBkaWprc3RyYShzdGFydCwgZ3JhcGgpOwoKICAgIGNvdXQgPDwgIk5hamtyb3RzemUgb2RsZWdsb3NjaSBvZCB3aWVyemNob2xrYSAiIDw8IHN0YXJ0IDw8ICI6XG4iOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXN0YW5jZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICBpZiAoZGlzdGFuY2VzW2ldID09IElORikKICAgICAgICAgICAgY291dCA8PCBpIDw8ICI6IElORlxuIjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNvdXQgPDwgaSA8PCAiOiAiIDw8IGRpc3RhbmNlc1tpXSA8PCAiXG4iOwogICAgfQoKICAgIHJldHVybiAwOwp9