#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
typedef pair< int , int > pii; // Para (waga, wierzchołek)
void dijkstra( int start, int n, const vector< vector< pii>> & graph) {
vector< int > dist( n, INT_MAX ) ; // Tablica odległości
dist[ start] = 0 ;
priority_queue< pii, vector< pii> , greater< pii>> pq; // Kolejka priorytetowa
pq.push ( { 0 , start} ) ;
while ( ! pq.empty ( ) ) {
int u = pq.top ( ) .second ;
int d = pq.top ( ) .first ;
pq.pop ( ) ;
// Jeśli już znaleźliśmy mniejszą odległość, pomijamy ten wierzchołek
if ( d > dist[ u] ) {
continue ;
}
// Przechodzimy po sąsiednich wierzchołkach
for ( const auto & neighbor : graph[ u] ) {
int v = neighbor.second ; // Wierzchołek sąsiedni
int weight = neighbor.first ; // Waga krawędzi
// Relaksacja krawędzi
if ( dist[ u] + weight < dist[ v] ) {
dist[ v] = dist[ u] + weight;
pq.push ( { dist[ v] , v} ) ;
}
}
}
// Wypisujemy najkrótsze odległości
for ( int i = 0 ; i < n; ++ i) {
if ( dist[ i] == INT_MAX ) {
cout << "Brak drogi do wierzchołka " << i << endl;
} else {
cout << "Odległość od wierzchołka " << start << " do " << i << " wynosi: " << dist[ i] << endl;
}
}
}
int main( ) {
int n, m; // n - liczba wierzchołków, m - liczba krawędzi
cout << "Podaj liczbę wierzchołków i krawędzi: " ;
cin >> n >> m;
vector< vector< pii>> graph( n) ;
cout << "Podaj krawędzie (wierzchołek1, wierzchołek2, waga):" << endl;
for ( int i = 0 ; i < m; ++ i) {
int u, v, weight;
cin >> u >> v >> weight;
graph[ u] .push_back ( { weight, v} ) ;
graph[ v] .push_back ( { weight, u} ) ; // Ponieważ graf jest nieskierowany
}
int start;
cout << "Podaj wierzchołek początkowy: " ;
cin >> start;
dijkstra( start, n, graph) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxjbGltaXRzPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOyAgLy8gUGFyYSAod2FnYSwgd2llcnpjaG/FgmVrKQoKdm9pZCBkaWprc3RyYShpbnQgc3RhcnQsIGludCBuLCBjb25zdCB2ZWN0b3I8dmVjdG9yPHBpaT4+JiBncmFwaCkgewogICAgdmVjdG9yPGludD4gZGlzdChuLCBJTlRfTUFYKTsgIC8vIFRhYmxpY2Egb2RsZWfFgm/Fm2NpCiAgICBkaXN0W3N0YXJ0XSA9IDA7CgogICAgcHJpb3JpdHlfcXVldWU8cGlpLCB2ZWN0b3I8cGlpPiwgZ3JlYXRlcjxwaWk+PiBwcTsgIC8vIEtvbGVqa2EgcHJpb3J5dGV0b3dhCiAgICBwcS5wdXNoKHswLCBzdGFydH0pOwoKICAgIHdoaWxlICghcHEuZW1wdHkoKSkgewogICAgICAgIGludCB1ID0gcHEudG9wKCkuc2Vjb25kOwogICAgICAgIGludCBkID0gcHEudG9wKCkuZmlyc3Q7CiAgICAgICAgcHEucG9wKCk7CgogICAgICAgIC8vIEplxZtsaSBqdcW8IHpuYWxlxbpsacWbbXkgbW5pZWpzesSFIG9kbGVnxYJvxZvEhywgcG9taWphbXkgdGVuIHdpZXJ6Y2hvxYJlawogICAgICAgIGlmIChkID4gZGlzdFt1XSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8vIFByemVjaG9kemlteSBwbyBzxIVzaWVkbmljaCB3aWVyemNob8WCa2FjaAogICAgICAgIGZvciAoY29uc3QgYXV0byYgbmVpZ2hib3IgOiBncmFwaFt1XSkgewogICAgICAgICAgICBpbnQgdiA9IG5laWdoYm9yLnNlY29uZDsgIC8vIFdpZXJ6Y2hvxYJlayBzxIVzaWVkbmkKICAgICAgICAgICAgaW50IHdlaWdodCA9IG5laWdoYm9yLmZpcnN0OyAgLy8gV2FnYSBrcmF3xJlkemkKCiAgICAgICAgICAgIC8vIFJlbGFrc2FjamEga3Jhd8SZZHppCiAgICAgICAgICAgIGlmIChkaXN0W3VdICsgd2VpZ2h0IDwgZGlzdFt2XSkgewogICAgICAgICAgICAgICAgZGlzdFt2XSA9IGRpc3RbdV0gKyB3ZWlnaHQ7CiAgICAgICAgICAgICAgICBwcS5wdXNoKHtkaXN0W3ZdLCB2fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gV3lwaXN1amVteSBuYWprcsOzdHN6ZSBvZGxlZ8WCb8WbY2kKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKGRpc3RbaV0gPT0gSU5UX01BWCkgewogICAgICAgICAgICBjb3V0IDw8ICJCcmFrIGRyb2dpIGRvIHdpZXJ6Y2hvxYJrYSAiIDw8IGkgPDwgZW5kbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb3V0IDw8ICJPZGxlZ8WCb8WbxIcgb2Qgd2llcnpjaG/FgmthICIgPDwgc3RhcnQgPDwgIiBkbyAiIDw8IGkgPDwgIiB3eW5vc2k6ICIgPDwgZGlzdFtpXSA8PCBlbmRsOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbiwgbTsgIC8vIG4gLSBsaWN6YmEgd2llcnpjaG/FgmvDs3csIG0gLSBsaWN6YmEga3Jhd8SZZHppCiAgICBjb3V0IDw8ICJQb2RhaiBsaWN6YsSZIHdpZXJ6Y2hvxYJrw7N3IGkga3Jhd8SZZHppOiAiOwogICAgY2luID4+IG4gPj4gbTsKCiAgICB2ZWN0b3I8dmVjdG9yPHBpaT4+IGdyYXBoKG4pOwoKICAgIGNvdXQgPDwgIlBvZGFqIGtyYXfEmWR6aWUgKHdpZXJ6Y2hvxYJlazEsIHdpZXJ6Y2hvxYJlazIsIHdhZ2EpOiIgPDwgZW5kbDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgICAgaW50IHUsIHYsIHdlaWdodDsKICAgICAgICBjaW4gPj4gdSA+PiB2ID4+IHdlaWdodDsKICAgICAgICBncmFwaFt1XS5wdXNoX2JhY2soe3dlaWdodCwgdn0pOwogICAgICAgIGdyYXBoW3ZdLnB1c2hfYmFjayh7d2VpZ2h0LCB1fSk7ICAvLyBQb25pZXdhxbwgZ3JhZiBqZXN0IG5pZXNraWVyb3dhbnkKICAgIH0KCiAgICBpbnQgc3RhcnQ7CiAgICBjb3V0IDw8ICJQb2RhaiB3aWVyemNob8WCZWsgcG9jesSFdGtvd3k6ICI7CiAgICBjaW4gPj4gc3RhcnQ7CgogICAgZGlqa3N0cmEoc3RhcnQsIG4sIGdyYXBoKTsKCiAgICByZXR1cm4gMDsKfQo=