#include #include #include #include #include #include using namespace std; #define INF 999999 typedef pair pii; list adj[INF]; int V; vector previous(INF, -1); int dijkstra(int src, int dest) { priority_queue, greater > pq; vector dist(INF, INF); previous.resize(V); pq.push(make_pair(0, src)); dist[src] = 0; while(!pq.empty()) { int u = pq.top().second; pq.pop(); for(auto const& i : adj[u]) { int v = i.first; int w = i.second; if(dist[v] > dist[u] + w) { dist[v] = dist[u] + w; pq.push({dist[v], v}); previous[v] = u; } } } return dist[dest]; } void dijShortPath(int v, list& path) { /* example: v = 6; v = previous[6] (5) v = previous[5] (2) ... */ for(; v != -1; v = previous[v]) path.push_front(v); } int main() { /* numVertici numArchi sorgente destinazione vertice1 vertice2 peso ... */ cin >> V; int e, sorg, dest; cin >> e >> sorg >> dest; int u, v, w; for(int i = 0; i < e; i++) { cin >> u >> v >> w; adj[u].push_back(make_pair(v, w)); } cout << dijkstra(sorg, dest) << endl; list path; dijShortPath(dest, path); for(auto const& i : path) cout << i << ' '; return 0; }