Dijkstra Algorithm – Finding Shortest Path
Dijkstra’s Algorithm is designed to determine the shortest routes between the source node and every other node in the network.
Algorithm:-
- Start with a weighted graph.
- Initialize source node with a distance of 0 & all other nodes with infinite distance.
- For each neighbor of source node, calculate the shortest distance between the current node’s distance and the distance to its neighbor.
- If the shortest distance is less than the distance of the other neighbor, then set that distance as the final shortest distance.
- Continue step 3 until we’ve calculated all nodes’ shortest path to source.
So let’s take a look at how this Dijkstra Algorithm works in C++
#include "iostream"
#include<conio.h>
#define INFINITY 99999
using namespace std;
class Dijkstra
{
private:
int graph[30][30];
int predecessor[30],dist[30];
bool mark[30];
int source;
int vertices;
public:
void input();
void initialize();
int search_min_node();
void calculate_dist();
void output();
void display_path(int);
};
void Dijkstra::input() {
cout<<"Enter the number of vertices of the graph(should be > 0)\n";
cin>>vertices;
while(vertices <= 0) {
cout<<"Enter the number of vertices of the graph(should be > 0)\n";
cin>>vertices; }
cout<<"Enter the adjacency matrix for the graph\n";
cout<<"To enter infinity enter "<<INFINITY<<endl;
for(int i=1;i<=vertices;i++) {
cout<<"Enter the positive weights for the row "<<i<<endl;
for(int j=1;j<=vertices;j++) {
cin>>graph[i][j];
while(graph[i][j]<0) {
cout<<"Weights should be positive. Enter the weight again\n";
cin>>graph[i][j];
} } }
cout<<"Enter the source vertex\n";
cin>>source;
while((source<0) && (source>vertices-1)) {
cout<<"Source vertex should be between 0 and"<<vertices-1<<endl;
cout<<"Enter the source vertex again\n";
cin>>source;
}
}
void Dijkstra::initialize() {
for(int i=1;i<=vertices;i++) {
mark[i] = false;
dist[i] = INFINITY ;
predecessor[i] = -1;
}
dist[source]= 0;
}
int Dijkstra::search_min_node() {
int min_dist = INFINITY;
int closestUnmarkedNode;
for(int i=1;i<=vertices;i++) {
if((!mark[i]) && ( min_dist >= dist[i])) {
min_dist = dist[i];
closestUnmarkedNode = i;
} }
return closestUnmarkedNode;
}
void Dijkstra::calculate_dist() {
initialize();
int minDistance = INFINITY;
int closestUnmarkedNode;
int count = 0;
while(count<vertices) {
closestUnmarkedNode = search_min_node();
mark[closestUnmarkedNode] = true;
for(int i=1;i<=vertices;i++) {
if((!mark[i]) && (graph[closestUnmarkedNode][i]>0) ) {
if(dist[i] > dist[closestUnmarkedNode]+graph[closestUnmarkedNode][i]) {
dist[i] = dist[closestUnmarkedNode]+graph[closestUnmarkedNode][i];
predecessor[i] = closestUnmarkedNode;
} } }
count++; }
}
void Dijkstra::display_path(int node) {
if(node == source)
cout<<(char)(node + 65)<<"..";
else if(predecessor[node] == -1)
cout<<"No path from “<<source<<”to "<<(char)(node + 97)<<endl;
else {
display_path(predecessor[node]);
cout<<(char) (node+65)<<"..";
}
getch();
}
void Dijkstra::output() {
for(int i=1;i<=vertices;i++) {
if(i == source)
cout<<(char)(source + 65)<<".."<<source;
else
display_path(i);
cout<<"->"<<dist[i]<<endl;
}
getch();
}
int main()
{
Dijkstra a;
a.input();
a.calculate_dist();
a.output();
return 0;
}
How this Dijkstra C++ Code Works?
Output Of This Code. . .
Enter the number of vertices of the graph(should be > 0)
5
Enter the adjacency matrix for the graph
To enter infinity enter 99999
Enter the positive weights for the row 1
0 1 6 0 0
Enter the positive weights for the row 2
1 0 2 3 5
Enter the positive weights for the row 3
6 2 0 4 2
Enter the positive weights for the row 4
0 3 4 0 2
Enter the positive weights for the row 5
0 5 2 2 0
Enter the source vertex 1
- B..1->0
- B..C..->1
- B..C..D..->3
- B..C..E..->4
- B..C..D..F..->5