From 2eae8617b15b1bdb31c18b397743439796952576 Mon Sep 17 00:00:00 2001 From: rachitmanas Date: Thu, 29 Oct 2020 01:57:31 +0530 Subject: [PATCH] Added Djikstra Algo for shortest path in C++ --- Graph algorithm/DjikstrasAlgo.cpp | 126 ++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 Graph algorithm/DjikstrasAlgo.cpp diff --git a/Graph algorithm/DjikstrasAlgo.cpp b/Graph algorithm/DjikstrasAlgo.cpp new file mode 100644 index 0000000..a6d133d --- /dev/null +++ b/Graph algorithm/DjikstrasAlgo.cpp @@ -0,0 +1,126 @@ +//By Rachit Manas +// Program to find Dijkstra's shortest path using +// priority_queue in STL +#include +using namespace std; +# define INF 0x3f3f3f3f + +// iPair ==> Integer Pair +typedef pair iPair; + +// This class represents a directed graph using +// adjacency list representation +class Graph +{ + int V; // No. of vertices + + // In a weighted graph, we need to store vertex + // and weight pair for every edge + list< pair > *adj; + +public: + Graph(int V); // Constructor + + // function to add an edge to graph + void addEdge(int u, int v, int w); + + // prints shortest path from s + void shortestPath(int s); +}; + +// Allocates memory for adjacency list +Graph::Graph(int V) +{ + this->V = V; + adj = new list [V]; +} + +void Graph::addEdge(int u, int v, int w) +{ + adj[u].push_back(make_pair(v, w)); + adj[v].push_back(make_pair(u, w)); +} + +// Prints shortest paths from src to all other vertices +void Graph::shortestPath(int src) +{ + // Create a priority queue to store vertices that + // are being preprocessed. This is weird syntax in C++. + // Refer below link for details of this syntax + // https://www.geeksforgeeks.org/implement-min-heap-using-stl/ + priority_queue< iPair, vector , greater > pq; + + // Create a vector for distances and initialize all + // distances as infinite (INF) + vector dist(V, INF); + + // Insert source itself in priority queue and initialize + // its distance as 0. + pq.push(make_pair(0, src)); + dist[src] = 0; + + /* Looping till priority queue becomes empty (or all + distances are not finalized) */ + while (!pq.empty()) + { + // The first vertex in pair is the minimum distance + // vertex, extract it from priority queue. + // vertex label is stored in second of pair (it + // has to be done this way to keep the vertices + // sorted distance (distance must be first item + // in pair) + int u = pq.top().second; + pq.pop(); + + // 'i' is used to get all adjacent vertices of a vertex + list< pair >::iterator i; + for (i = adj[u].begin(); i != adj[u].end(); ++i) + { + // Get vertex label and weight of current adjacent + // of u. + int v = (*i).first; + int weight = (*i).second; + + // If there is shorted path to v through u. + if (dist[v] > dist[u] + weight) + { + // Updating distance of v + dist[v] = dist[u] + weight; + pq.push(make_pair(dist[v], v)); + } + } + } + + // Print shortest distances stored in dist[] + printf("Vertex Distance from Source\n"); + for (int i = 0; i < V; ++i) + printf("%d \t\t %d\n", i, dist[i]); +} + +// Driver program to test methods of graph class +int main() +{ + // create the graph given in above fugure + int V = 9; + Graph g(V); + + // making above shown graph + g.addEdge(0, 1, 4); + g.addEdge(0, 7, 8); + g.addEdge(1, 2, 8); + g.addEdge(1, 7, 11); + g.addEdge(2, 3, 7); + g.addEdge(2, 8, 2); + g.addEdge(2, 5, 4); + g.addEdge(3, 4, 9); + g.addEdge(3, 5, 14); + g.addEdge(4, 5, 10); + g.addEdge(5, 6, 2); + g.addEdge(6, 7, 1); + g.addEdge(6, 8, 6); + g.addEdge(7, 8, 7); + + g.shortestPath(0); + + return 0; +}