Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector<int> djikstra(int n, vector<vector<pair<int, int> > > &adj){
- priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > pq;
- vector<int> distance(n, INT_MAX), parent(n, -1);
- //Start djikstra from source
- pq.emplace(0, 0);
- distance[0] = 0;
- while(!pq.empty()){
- pair<int, int> top = pq.top();
- pq.pop();
- int node = top.second, nodeDist = top.first;
- //Ignore those occurences which are not the best, popped out after the first occurence
- if(distance[node] < nodeDist){
- continue;
- }
- for(int i = 0; i < adj[node].size(); i++){
- int child = adj[node][i].first, childDist = adj[node][i].second + nodeDist;
- if(childDist < distance[child]){
- pq.emplace(childDist, child);
- distance[child] = childDist;
- parent[child] = node;
- }
- }
- }
- vector<int> path;
- if(distance[n - 1] != INT_MAX){
- path.push_back(distance[n - 1]);
- for(int i = n - 1; i >= 0;){
- //Revert back to 1 based indexing
- path.push_back(i + 1);
- i = parent[i];
- }
- reverse(path.begin() + 1, path.end());
- }
- else{
- path.push_back(-1);
- }
- return path;
- }
- vector<int> shortestPath(int n, int m, vector<vector<int> > &edges){
- vector<vector<pair<int, int> > > adj(n, vector<pair<int, int> >());
- for(int i = 0; i < m; i++){
- //Convert 1 based indexing to 0 based
- int u = edges[i][0] - 1, v = edges[i][1] - 1, w = edges[i][2];
- adj[u].emplace_back(v, w);
- adj[v].emplace_back(u, w);
- }
- return djikstra(n, adj);
- }
- int main() {
- // your code goes here
- int n, m;
- cin >> n >> m;
- vector<vector<int> > edges(m, vector<int>(3));
- for(int i = 0; i < m; i++){
- cin >> edges[i][0] >> edges[i][1] >> edges[i][2];
- }
- vector<int> path = shortestPath(n, m, edges);
- for(int i : path){
- cout << i << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment