Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. /*
  2. Find single source shortest path - Dijkstra's algo
  3. and print the distance as well as path
  4. Input:
  5. n-vertices , m-edges
  6. u , v , w - undirected edge with weight w
  7. 9 14
  8. 0 1 4
  9. 0 7 8
  10. 1 7 11
  11. 1 2 8
  12. 7 8 7
  13. 7 6 1
  14. 2 8 2
  15. 8 6 6
  16. 2 3 7
  17. 2 5 4
  18. 6 5 2
  19. 3 5 14
  20. 3 4 9
  21. 5 4 10
  22.  
  23. Output:
  24. vertex distance Path
  25. 0 -> 1 4 0 1
  26. 0 -> 2 12 0 1 2
  27. 0 -> 3 19 0 1 2 3
  28. 0 -> 4 21 0 7 6 5 4
  29. 0 -> 5 11 0 7 6 5
  30. 0 -> 6 9 0 7 6
  31. 0 -> 7 8 0 7
  32. 0 -> 8 14 0 1 2 8
  33.  
  34. Time Compexity : O(E logV)
  35. using multiset as min priority queue
  36.  
  37. */
  38. #include<bits/stdc++.h>
  39. using namespace std;
  40.  
  41. #define INF 1000000000
  42.  
  43. void printPath(vector<int> &parent, int j)
  44. {
  45. // Base Case : If j is source
  46. if (parent[j]==-1)
  47. {
  48. cout<< j << " ";
  49. return ;
  50. }
  51.  
  52.  
  53. printPath(parent, parent[j]);
  54.  
  55. cout<< j << " ";
  56. }
  57.  
  58. void dijkstra(vector<vector<pair<int , int>>> &adj , vector<int> &dist ,
  59. vector<int> &vis , vector<int> &parent){
  60.  
  61. multiset < pair < int , int > > s; // multiset do the job as a min-priority queue
  62. s.insert({0 , 0}); // insert the source node with distance = 0
  63. parent[0] = -1 ;
  64. dist[0] = 0;
  65.  
  66. while(!s.empty()){
  67.  
  68. pair <int , int> p = *s.begin(); // pop the vertex with the minimum distance
  69. s.erase(s.begin());
  70.  
  71. int u = p.second;
  72.  
  73. if( vis[u] ) continue; // check if the popped vertex is visited before
  74.  
  75. vis[u] = true;
  76.  
  77. for(int i = 0; i < adj[u].size(); i++)
  78. {
  79. int v = adj[u][i].second; int w = adj[u][i].first;
  80.  
  81. if(!vis[v] && dist[u] + w < dist[v] )
  82. {
  83. // check if the next vertex distance could be minimized
  84. dist[v] = dist[u] + w;
  85. s.insert({dist[v], v} ); // insert the next vertex with the updated distance
  86. parent[v] = u ;
  87. }
  88. }
  89. }
  90. }
  91.  
  92. int main(){
  93.  
  94. int n,m,u,v,w;
  95. cin>>n>>m; //Nodes and edges.
  96. vector<vector<pair<int , int>>> adj(n) ;
  97. for(int i=0;i<m;i++)
  98. {
  99. cin>>u>>v>>w;
  100. adj[u].push_back(make_pair(w,v)); //undirected graph
  101. adj[v].push_back(make_pair(w,u));
  102. }
  103.  
  104. vector<int> dist(n , INF ) ;
  105. vector<int> vis(n , false) ;
  106. vector<int> parent(n , -1) ;
  107.  
  108. dijkstra(adj , dist , vis , parent);
  109.  
  110. for(int i=1;i<n;i++)
  111. {
  112. cout<< 0 << " -> " << i << "\t" ;
  113. cout<<dist[i]<<"\t";
  114. printPath(parent , i) ;
  115. cout<<endl ;
  116. }
  117. return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement