Advertisement
Ridwanul_Haque

Dijkstra + Bellman ( Adj List + Priority Queue )

Mar 13th, 2020
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. # define INF 0x3f3f3f3f
  4.  
  5. typedef pair<int, int> PAIR;
  6.  
  7. class Edge
  8. {
  9.     int V;
  10.     int u,v,w;
  11.     list<PAIR> *adj;
  12.  
  13. public:
  14.     Edge(int V)
  15.     {
  16.         this->V = V;
  17.         adj = new list<PAIR> [V];
  18.  
  19.     }
  20.     int getVerticesNumber()
  21.     {
  22.         return V;
  23.     }
  24.     int getWeight()
  25.     {
  26.         return w;
  27.     }
  28.  
  29.     void setEdge(int u,int v,int w)
  30.     {
  31.         adj[u].push_back(make_pair(v,w));
  32.     }
  33.  
  34. };
  35.  
  36.  
  37. class Graph
  38. {
  39.     int V,m;
  40.  
  41.     list< pair<int, int> > *adj;
  42.  
  43. public:
  44.     Graph(int V,int m);
  45.  
  46.  
  47.     void addEdge(int u, int v, int w);
  48.  
  49.  
  50.     void Dijkstra(int s);
  51.     bool Bellman(int s);
  52. };
  53.  
  54. Graph::Graph(int V,int m)
  55. {
  56.     this->V = V;
  57.     this->m = m;
  58.     adj = new list<PAIR> [V];
  59. }
  60.  
  61. void Graph::addEdge(int u, int v, int w)
  62. {
  63.  
  64.     adj[u].push_back(make_pair(v, w));
  65.     //adj[v].push_back(make_pair(u, w));
  66. }
  67.  
  68.  
  69. void Graph::Dijkstra(int src)
  70. {
  71.  
  72.     priority_queue< PAIR, vector <PAIR>, greater<PAIR> > pq;
  73.     vector<int> dist(V, INF);
  74.  
  75.     pq.push(make_pair(0, src));
  76.     dist[src] = 0;
  77.  
  78.     while (!pq.empty())
  79.     {
  80.  
  81.         int u = pq.top().second;
  82.         pq.pop();
  83.  
  84.         for (auto i = adj[u].begin(); i != adj[u].end(); ++i)
  85.         {
  86.  
  87.             int v = (*i).first;
  88.             int weight = (*i).second;
  89.  
  90.             if (dist[v] > dist[u] + weight)
  91.             {
  92.  
  93.                 dist[v] = dist[u] + weight;
  94.                 pq.push(make_pair(dist[v], v));
  95.             }
  96.         }
  97.     }
  98.  
  99.     printf("Vertex Distance from Source\n");
  100.     for (int i = 0; i < V; ++i)
  101.         printf("%d \t\t %d\n", i, dist[i]);
  102. }
  103.  
  104. bool Graph::Bellman(int src)
  105. {
  106.     bool negative_edge = false;
  107.     vector<int> dist(V, INF);
  108.     dist[src] = 0;
  109.  
  110.     for(int i = 0; i<V-1; i++)
  111.     {
  112.         for(int u = 0; u<V;u++)
  113.         {
  114.             for(auto j = adj[u].begin();j!=adj[u].end();j++)
  115.             {
  116.                 int v = (*j).first;
  117.                 int w = (*j).second;
  118.  
  119.                 if(dist[u]!=INF && dist[v] > dist[u] + w)
  120.                 {
  121.                     dist[v] = dist[u] + w;
  122.                 }
  123.             }
  124.         }
  125.     }
  126.  
  127.     for(int u = 0; u<V;u++)
  128.         {
  129.             for(auto j = adj[u].begin();j!=adj[u].end();j++)
  130.             {
  131.                 int v = (*j).first;
  132.                 int w = (*j).second;
  133.  
  134.                 if(dist[u]!=INF && dist[v] > dist[u] + w)
  135.                 {
  136.                     negative_edge = true;
  137.                     return negative_edge;
  138.                 }
  139.             }
  140.         }
  141.  
  142.         return negative_edge;
  143.  
  144. }
  145.  
  146. int main()
  147. {
  148.  
  149.     int V = 9;
  150.     int m = 14;
  151.     Graph g(V,m);
  152.     g.addEdge(0, 1, 4);
  153.     g.addEdge(0, 7, 8);
  154.     g.addEdge(1, 2, 8);
  155.     g.addEdge(1, 7, 11);
  156.     g.addEdge(2, 3, 7);
  157.     g.addEdge(2, 8, 2);
  158.     g.addEdge(2, 5, 4);
  159.     g.addEdge(3, 4, 9);
  160.     g.addEdge(3, 5, 14);
  161.     g.addEdge(4, 5, 10);
  162.     g.addEdge(5, 6, 2);
  163.     g.addEdge(6, 7, 1);
  164.     g.addEdge(6, 8, 6);
  165.     g.addEdge(7, 8, 7);
  166.  
  167.     g.Dijkstra(0);
  168.     g.Bellman(0);
  169.  
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement