Here you will learn about Dijkstra’s algorithm and how you can implement it in C programming.
Dijkstra algorithm is also called the single source shortest path algorithm. It is based on the greedy technique. The algorithm maintains a list visited[ ] of vertices, whose shortest distance from the source is already known.
If visited[1], equals 1, then the shortest distance of vertex i is already known. Initially, visited[i] is marked as, for source vertex.
At each step, we mark visited[v] as 1. Vertex v is a vertex at the shortest distance from the source vertex. At each step of the algorithm, the shortest distance of each vertex is stored in an array distance[ ].
Also Read: Prim’s Algorithm in C
Dijkstra’s Algorithm
1. 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.
2. Array visited[ ] is initialized to zero.
for(i=0;i<n;i++)
visited[i]=0;
3. If the vertex 0 is the source vertex then visited[0] is marked as 1.
4. 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, the distance of the source vertex is taken as 0. i.e. distance[0]=0;
5. for(i=1;i<n;i++)
– 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 the 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])
Time Complexity
The program contains two nested loops each of which has a complexity of O(n). n is the number of vertices. So the complexity of the algorithm is O(n2).
Dijkstra’s Algorithm Program in C
Here is the C Program on Dijkstra Algorithm for finding the Minimum Distance of Vertices from a Given Source in a Graph.
#include<stdio.h>
#include<conio.h>
#define INFINITY 9999
#define MAX 10
void dijkstra(int G[MAX][MAX],int n,int startnode);
int main()
{
int G[MAX][MAX],i,j,n,u;
printf("Enter no. of vertices:");
scanf("%d",&n);
printf("\nEnter the adjacency matrix:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&G[i][j]);
printf("\nEnter the starting node:");
scanf("%d",&u);
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;
//pred[] stores the predecessor of each node
//count gives the number of nodes seen so far
//create the cost matrix
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];
//initialize pred[],distance[] and visited[]
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;
//nextnode gives the node at minimum distance
for(i=0;i<n;i++)
if(distance[i]<mindistance&&!visited[i])
{
mindistance=distance[i];
nextnode=i;
}
//check if a better path exists through nextnode
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++;
}
//print the path and distance of each node
for(i=0;i<n;i++)
if(i!=startnode)
{
printf("\nDistance of node%d=%d",i,distance[i]);
printf("\nPath=%d",i);
j=i;
do
{
j=pred[j];
printf("<-%d",j);
}while(j!=startnode);
}
}
Output:
This program calculates the shortest distance from the starting node to all the other nodes in the graph. It also prints the distance and the path from the starting node to each node.
The algorithm works by maintaining a list of visited nodes. And for each unvisited node, it calculates the distance to that node from the starting node and updates the distance and the path if a shorter path is found.
The algorithm continues until all nodes have been visited, and the shortest distance and the path to each node have been calculated.
Now I hope you know how to implement this algorithm in C. Comment below if you have any queries or found something wrong in Dijkstra’s algorithm in C.
What does the n in the FOR loops stand for?
Numbers of vertexes.
thanks for giving such a best program.
You have a typo in step 2. The for loop should be (for i = 0; i < n; i++) visited[i] = 0; You have a "1" in the brackets so the for loop is pointless by initializing the second element over and over, n times.
Thanks a lot Tyler for pointing out the mistake 🙂
Please, explain, how to let user to enter the amount of vertices?
It is really important for me
You have a typo in step 2. The for loop should be (for i = 0; i < n; i++) visited[i] = 0; You have a "1" in the brackets so the for loop is pointless by initializing the second element over and over, n times.
for(i=1;i<n;i++)
distance[i]=cost[0][i];
how does it work
What would need to be changed in the algorithm if we have a rectangular matrix n*m? Because I have a maze of size n*m and I need to find shortest path from some spot in the maze to the exit. Any help with that?
I think you only need to set your node count to M * N.
I WORKED OUT , CODE IS CORRECT.
THANKS
Not working
im trying to short out how to make it show the distance and the path between 2 points and not all, for instance if i want to go from a to b what is the best path and the cost.
Can you please help me to convert this code to find longest path, I have tried but few problems are coming. Its very important to me, your help is more precious.
thanks dear, it is very nice program for understanding…………..
nice website. here everything is given detailed. convenient way to study for student.
this website is amazing.codes are easily understandable.i always follow this website.
can i get bellman ford code in this taste ?
Hey, could you please modify your code to find the k-shortest path. It would be much appreciated. Thanks
nice ….is been hekpfull.
what happens if two paths have the same length
hey the code is running properly for 9 vertices, but is giving problems when the number of vertices are 16. your help will be valuable
MAX is defined to 10. So it works upto 10 vertices, change it to 16
Changing MAX works
I have an adjacency matrix of 25 by 25. The code isn’t working for the following. What should I do?
Your matrix is ti big, change the variable MAX to be 25 or 26, to be safe. You can find it in the first line of codes wheere is the keyword DEFINE
hi, im having problem for my assignment. i have assign to do a shortest path in GPS system code in c.
where i need to create a map or path and ask the user to insert starting point and destination and we also have to calculate and display 3 shortest path based on ranking and display the history record
Dear Author
Please help me to created shorthest path and longest path distance in one program , how to add longest path distance in that code in dev c++ ? . i have try but always error for add longest path distance Please help me , i beg to you for my assignment , please sir help me . you can send in my email the code , anyone please help me , its important.
Email : Faeshal111@gmail.com
hello,
nice code , but i think something is missing.
your program will show the paths to the other nodes but , if I want the shortest path from a specific source to a specific destination?
one more variable is required
The Best….
Thanks dude! This helped me a lot in understanding the algorithm, cheers! 🙂
how do you find the execution time of the above program?
Programs are witten in difficult ways.
What I found that a program is considered best in written complex way.
But any software program is considered in written is simple and understandable manner.
There might be hundreds of ways to write A+B=C but in India the one with max number of code lines would fetch max marks irrespective if its worth or fuddu
output plzz….
Why haven’t we first created a graph and then used its adjacency matrix, for further work. Isn’t it wrong just to have a 2-D array and applying the stuff to it?
how i give infinity as input
Plz anybody help me i need to find the longest path…anyone give me the full code plz
This does not work if I add other ways to get n, u and G
very nice article
understandable
You have a typo in step 2. The for loop should be (for i = 0; i < n; i++) visited[i] = 0; You have a "1" in the brackets so the for loop is pointless by initializing the second element over and over, n times.
What is the “!visited”? Is it like “visited != 0”??
can u give me the output
i worked….code is correct!
there is mistake from you
code works nicely
Thanks a lot!
The code works well !
Explain step by step!!!!
Hello,
Can you please explain me how it works?
for(i=0;i<n;i++)
if(i!=startnode)
{
printf("\nDistance of node%d=%d",i,distance[i]);
printf("\nPath=%d",i);
j=i;
do
{
j=pred[j];
printf("<-%d",j);
}while(j!=startnode);
}
why pred[j] is the previus node?
dont know
If there is o/p it is east to understand
Yes, it work loop
I get segmentation fault while running this program. Could anybody help?
Can anyone explain how the paths are printing means how the do while loop is working
Hi , thank you for this beautiful code, now i understand Djikstra algorithm 🙂
I’ll use it to model points and streets on a map to find the shortest driving way, like GPS 😀