
- C++ Basics
- C++ Home
- C++ Overview
- C++ Environment Setup
- C++ Basic Syntax
- C++ Comments
- C++ Data Types
- C++ Variable Types
- C++ Variable Scope
- C++ Constants/Literals
- C++ Modifier Types
- C++ Storage Classes
- C++ Operators
- C++ Loop Types
- C++ Decision Making
- C++ Functions
- C++ Numbers
- C++ Arrays
- C++ Strings
- C++ Pointers
- C++ References
- C++ Date & Time
- C++ Basic Input/Output
- C++ Data Structures
- C++ Object Oriented
- C++ Classes & Objects
- C++ Inheritance
- C++ Overloading
- C++ Polymorphism
- C++ Abstraction
- C++ Encapsulation
- C++ Interfaces
C++ Program for Dijkstra’s shortest path algorithm?
Dijkstra's algorithm (or Dijkstra's Shortest Path First algorithm, SPF algorithm) is an algorithm for finding the shortest paths between nodes in a graph, which may represent, for example, road networks. The algorithm creates a tree of shortest paths from the starting vertex, the source, to all other points in the graph.
Dijkstra’s algorithm finds a shortest path tree from a single source node, by building a set of nodes that have minimum distance from the source.
The graph has the following−
vertices, or nodes, denoted in the algorithm by v or u.
weighted edges that connect two nodes: (u,v) denotes an edge, and w(u,v)denotes its weight. In the diagram on the right, the weight for each edge is written in gray.
Algorithm Steps
- Set all vertices distances = infinity except for the source vertex, set the source distance = 0.
- Push the source vertex in a min-priority queue in the form (distance , vertex), as the comparison in the min-priority queue will be according to vertices distances.
- Pop the vertex with the minimum distance from the priority queue (at first the popped vertex = source).
- Update the distances of the connected vertices to the popped vertex in case of "current vertex distance + edge weight < next vertex distance", then push the vertex with the new distance to the priority queue.
- If the popped vertex is visited before, just continue without using it.
- Apply the same algorithm again until the priority queue is empty.
Given a graph and a source vertex in the graph, find shortest paths from source to all vertices in the given graph. Given G[][] matrix of graph weight, n no of vertex in graph, u starting node.
Input
G[max][max]={{0,1,0,3,10}, {1,0,5,0,0}, {0,5,0,2,1}, {3,0,2,0,6}, {10,0,1,6,0}} n=5 u=0
Output
Distance of node1=1 Path=1<-0 Distance of node2=5 Path=2<-3<-0 Distance of node3=3 Path=3<-0 Distance of node4=6 Path=4<-2<-3<-0
Explanation
Create cost matrix C[ ][ ] from adjacency matrix adj[ ][ ]. C[i][j] is the cost of going from vertex i to vertex j. If there is no edge between vertices i and j then C[i][j] is infinity.
Array visited[ ] is initialized to zero.
for(i=0;i<n;i++) visited[i]=0;
If the vertex 0 is the source vertex then visited[0] is marked as 1.
Create the distance matrix, by storing the cost of vertices from vertex no. 0 to n-1 from the source vertex 0.
for(i=1;i<n;i++) distance[i]=cost[0][i];
Initially, distance of source vertex is taken as 0. i.e. distance[0]=0;
for(i=1;i<n;i++) visited[i]=0;
Choose a vertex w, such that distance[w] is minimum and visited[w] is 0. Mark visited[w] as 1.
Recalculate the shortest distance of remaining vertices from the source.
Only, the vertices not marked as 1 in array visited[ ] should be considered for recalculation of distance. i.e. for each vertex v
if(visited[v]==0) distance[v]=min(distance[v], distance[w]+cost[w][v])
Example
#include<iostream> #include<stdio.h> using namespace std; #define INFINITY 9999 #define max 5 void dijkstra(int G[max][max],int n,int startnode); int main() { int G[max][max]={{0,1,0,3,10},{1,0,5,0,0},{0,5,0,2,1},{3,0,2,0,6},{10,0,1,6,0}}; int n=5; int u=0; dijkstra(G,n,u); return 0; } void dijkstra(int G[max][max],int n,int startnode) { int cost[max][max],distance[max],pred[max]; int visited[max],count,mindistance,nextnode,i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) if(G[i][j]==0) cost[i][j]=INFINITY; else cost[i][j]=G[i][j]; for(i=0;i<n;i++) { distance[i]=cost[startnode][i]; pred[i]=startnode; visited[i]=0; } distance[startnode]=0; visited[startnode]=1; count=1; while(count<n-1) { mindistance=INFINITY; for(i=0;i<n;i++) if(distance[i]<mindistance&&!visited[i]) { mindistance=distance[i]; nextnode=i; } visited[nextnode]=1; for(i=0;i<n;i++) if(!visited[i]) if(mindistance+cost[nextnode][i]<distance[i]) { distance[i]=mindistance+cost[nextnode][i]; pred[i]=nextnode; } count++; } for(i=0;i<n;i++) if(i!=startnode) { cout<<"\nDistance of node"<<i<<"="<<distance[i]; cout<<"\nPath="<<i; j=i; do { j=pred[j]; cout<<"<-"<<j; }while(j!=startnode); } }
- Related Articles
- C / C++ Program for Dijkstra's shortest path algorithm
- Dijkstra's algorithm in Javascript
- Dijkstra’s Shortest Path Algorithm
- Yen's k-Shortest Path Algorithm in Data Structure
- Shortest Path algorithm in Computer Network
- Dijkstra’s algorithm to compute the shortest path through a graph
- Bellman–Ford Algorithm for Shortest Paths
- Can we use Simple Queue instead of Priority queue to implement Dijkstra’s Algorithm?
- Shortest path algorithms in Javascript
- C++ program to find out the shortest cost path in a given graph for q queries
- Shortest path with exactly k Edges
- Print shortest path to print a string on screen in C Program.
- C program to implement Euclid’ s algorithm
- Fleury’s Algorithm for printing Eulerian Path or Circuit in C++
- Shortest Path in Binary Matrix in C++
