Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- #include<stack>
- using namespace std;
- typedef pair<int, int> ii;
- typedef vector<int> vi;
- typedef vector<ii> vii;
- vector<vii> AdjList;
- priority_queue< ii, vector<ii>, greater<ii> > pq;
- vi dist;
- vi pre;
- #define INF 1000000000
- void dijkstra(int s){
- dist[s] = 0;
- pq.push(ii(0, s));
- while (!pq.empty()) {
- ii front = pq.top();
- pq.pop();
- int w = front.first;
- int u = front.second;
- if (w > dist[u]){
- continue;
- }
- for (int j = 0; j < AdjList[u].size(); j++) {
- ii v = AdjList[u][j];
- if (dist[u] + v.second < dist[v.first]) {
- dist[v.first] = dist[u] + v.second;
- pq.push(ii(dist[v.first], v.first));
- pre[v.first]=u;
- }
- }
- }
- }
- int main() {
- int A, B, V, E, s, a, b, w;
- cin >>A>>B>> V >> E;
- AdjList.assign(V, vii());
- dist.assign(V, INF);
- pre.assign(V, 0);
- for (int i = 0; i < E; i++) {
- cin >> a >> b >> w;
- AdjList[a].push_back(ii(b, w));
- }
- dijkstra(A);
- stack<int> path;
- if (dist[B] != INF){
- path.push(B);
- cout << dist[B] << endl;
- int p = pre[B];
- while (p!=A){
- path.push(p);
- p = pre[p];
- }
- path.push(A);
- while (!path.empty()){
- cout << path.top() << " ";
- path.pop();
- }
- }
- else
- cout << "-1";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement