Milivoje se preselio u novi grad. On želi da koristi javni prevoz u ovom gradu. Pravila prevoza su sledeća:
Milivoje nema dovoljno novca, i potrebna mu je pomoc da dođe od prve do poslednje stanice a da potroši najmanje novca. Pomozite Milivoju!
Sa standardnog ulaza se unosi broj \(n\) koji predstavlja broj stanica (stanice su numerisane od 1 do n), zatim i broj \(m\) koji predstavlja broj linija javnog prevoza. Zatim se unosi \(m\) trojki brojeva (\(a\), \(b\), i \(c\)) koji predstavljaju stanice koje su povezane, kao i cenu puta od jedne stanice do druge.
Na standardni izlaz ispisati jedan broj koji predstavlja najjeftiniji put od stanice 1 do stanice \(n\) ukoliko Milivoje koristi javni prevoz.
5 5 1 2 60 3 5 70 1 4 120 4 5 150 2 3 80
80
U ovom bloku se opisuje glavno rešenje zadatka.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <limits>
#define INFINITY numeric_limits<int>::max()
using namespace std;
struct poredjenje
{bool operator()(const pair<int, int> &p1, const pair<int, int> &p2)
{return p1.first > p2.first;
}
};
class Graph {
private:
int broj_cvorova;
int, int>>> lista_suseda;
vector<vector<pair<int> udaljenosti;
vector<bool> nadjeni_putevi;
vector<
public:
int broj_cvorova) {
Graph(
broj_cvorova++;this->broj_cvorova = broj_cvorova;
lista_suseda.resize(broj_cvorova);
udaljenosti.resize(broj_cvorova, INFINITY);false);
nadjeni_putevi.resize(broj_cvorova,
}
void dodaj_granu(int u, int v, int w) {
lista_suseda[u].push_back({v, w});
lista_suseda[v].push_back({u, w});
}
int dijkstra(int u, int v) {
int, int>, vector<pair<int, int>>, poredjenje> hip;
priority_queue<pair<
0;
udaljenosti[u] =
hip.push(make_pair(udaljenosti[u], u));
int, int> tmp;
pair<
while (!hip.empty()) {
tmp = hip.top();
hip.pop();
if (nadjeni_putevi[tmp.second]) {
continue;
}
true;
nadjeni_putevi[tmp.second] =
for (pair<int, int> &sused : lista_suseda[tmp.second]) {
if (nadjeni_putevi[sused.first]) {
continue;
}
int cena = sused.second < udaljenosti[tmp.second] ? 0 : (sused.second - udaljenosti[tmp.second]);
if (udaljenosti[sused.first] > udaljenosti[tmp.second] + cena) {
udaljenosti[sused.first] = udaljenosti[tmp.second] + cena;std::make_pair(udaljenosti[sused.first], sused.first));
hip.push(
}
}
}
return udaljenosti[v];
}
};
int main() {
int n, m, x, y, w;
std::cin >> n >> m;
Graph g(n);
for (int i = 0; i < m; i++) {
std::cin >> x >> y >> w;
g.dodaj_granu(x, y, w);
}
std::cout << g.dijkstra(1, n) << "\n";
}