Advertisement
a_pramanik

Dijkstra improved

Jun 2nd, 2016
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. #include <cstring>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. typedef pair< int, int > pii;
  8.  
  9. const int MAX = 1024;
  10. const int INF = 0x3f3f3f3f;
  11.  
  12. vector< pii > G[MAX];
  13. int d[MAX];
  14.  
  15. void dijkstra(int start) {
  16. int u, v, i, c, w;
  17. priority_queue< pii, vector< pii >, greater< pii > > Q;
  18.  
  19. memset(d, 0x3f, sizeof d);
  20. Q.push(pii(0, start));
  21. d[start] = 0;
  22.  
  23. while(!Q.empty()) {
  24. u = Q.top().second; // node
  25. c = Q.top().first; // node cost so far
  26. Q.pop(); // remove the top item.
  27.  
  28. if(d[u] < c) continue;
  29.  
  30. for(i = 0; i < G[u].size(); i++) {
  31. v = G[u][i].first; // node
  32. w = G[u][i].second; // edge weight
  33.  
  34. if(d[v] > d[u] + w) {
  35. d[v] = d[u] + w;
  36. Q.push(pii(d[v], v));
  37. }
  38. }
  39. }
  40. }
  41.  
  42. int main() {
  43. int n, e, i, u, v, w, start;
  44. while(scanf("%d %d", &n, &e) == 2) {
  45. for(i = 1; i <= n; i++) G[i].clear();
  46. for(i = 0; i < e; i++) {
  47. scanf("%d %d %d", &u, &v, &w);
  48. G[u].push_back(pii(v, w));
  49. G[v].push_back(pii(u, w)); // only if bi-directional
  50. }
  51. scanf("%d", &start);
  52.  
  53. dijkstra(start);
  54.  
  55. printf("Shortest path from node %d:\n", start);
  56. for(i = 1; i <= n; i++) {
  57. if(i == start) continue;
  58. if(d[i] >= INF) printf("\t to node %d: unreachable\n", i);
  59. else printf("\t to node %d: %d\n", i, d[i]);
  60. }
  61. }
  62. return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement