In this article I describe a way of modifying Dijkstra’s Alogrithm in order to find all the shortest path from a source to a node.
This article assumes you know how Dijkstra’s Algorithm works. If you don’t, see my previous post or the Wikipedia article.
The Problem
You know how to use Dijkstra’s algorithm to find the length of the shortest path to a node. You’ve even figured out how to record the path to each node. But you what you really need are all the shortest paths leading to a node.
The Idea
I can help, but to be honest, this is obvious.
In order to record the path to each node, I used an array to record which node comes before each other node in the shortest path. That is to say: prev[i] was the node that comes just before node i in the shortest path from the source to node i.
To record all the shortest paths that lead to a node, I just turned prev into a matrix with the following meaning: prev[i][0] is the number of nodes that could come before node i on a path of minimum length; prev[i][1..] are the nodes that could come before node i on path of minimum length.
The Programme
Here’s the code in C (dijkstraAll.c):
#include <stdio.h>
#define GRAPHSIZE 2048
#define INFINITY GRAPHSIZE*GRAPHSIZE
#define MAX(a, b) ((a > b) ? (a) : (b))
int e; /* The number of nonzero edges in the graph */
int n; /* The number of nodes in the graph */
long dist[GRAPHSIZE][GRAPHSIZE]; /* dist[i][j] is the distance between node i and j; or 0 if there is no direct connection */
long d[GRAPHSIZE]; /* d[i] is the length of the shortest path between the source (s) and node i */
int prev[GRAPHSIZE][GRAPHSIZE + 1]; /* prev[i] holds the nodes that could comes right before i in the shortest path from the source to i;
prev[i][0] is the number of nodes and prev[i][1..] are the nodes */
void printD() {
int i;
printf("Distances:\n");
for (i = 1; i <= n; ++i)
printf("%10d", i);
printf("\n");
for (i = 1; i <= n; ++i) {
printf("%10ld", d[i]);
}
printf("\n");
}
/*
* Prints the shortest path from the source to dest.
*
* dijkstra(int) MUST be run at least once BEFORE
* this is called
*/
void printPath(int dest, int depth) {
int i, j;
printf("-%d\n", dest);
for (i = 1; i <= prev[dest][0]; ++i) {
for (j = 0; j <= depth; ++j)
printf(" |");
printPath(prev[dest][i], depth + 1);
}
}
void dijkstra(int s) {
int i, k, mini;
int visited[GRAPHSIZE];
for (i = 1; i <= n; ++i) {
d[i] = INFINITY;
prev[i][0] = 0; /* no path has yet been found to i */
visited[i] = 0; /* the i-th element has not yet been visited */
}
d[s] = 0;
for (k = 1; k <= n; ++k) {
mini = -1;
for (i = 1; i <= n; ++i)
if (!visited[i] && ((mini == -1) || (d[i] < d[mini])))
mini = i;
visited[mini] = 1;
for (i = 1; i <= n; ++i)
if (dist[mini][i]) {
if (d[mini] + dist[mini][i] < d[i]) { /* a shorter path has been found */
d[i] = d[mini] + dist[mini][i];
prev[i][0] = 1;
prev[i][1] = mini;
} else if (d[mini] + dist[mini][i] == d[i]) { /* a path of the same length has been found */
++prev[i][0];
prev[i][prev[i][0]] = mini;
}
}
}
}
int main(int argc, char *argv[]) {
int i, j;
int u, v, w;
FILE *fin = fopen("dist.txt", "r");
fscanf(fin, "%d", &e);
for (i = 0; i < e; ++i)
for (j = 0; j < e; ++j)
dist[i][j] = 0;
n = -1;
for (i = 0; i < e; ++i) {
fscanf(fin, "%d%d%d", &u, &v, &w);
dist[u][v] = w;
n = MAX(u, MAX(v, n));
}
fclose(fin);
dijkstra(1);
printD();
printf("\n");
for (i = 1; i <= n; ++i) {
printf("Path to %d:\n", i);
printPath(i, 0);
printf("\n");
}
return 0;
}
And here’s an input file: dist.txt.
10
1 2 5
1 4 3
2 3 1
2 4 3
3 5 6
4 2 2
4 3 9
4 5 2
5 1 7
5 3 4
The input file describes this graph:

As you can see, there are two paths from node 1 to node 3: 1 -> 2 -> 3 and 1 -> 4 -> 2 -> 3 both of length 6.
Now, what does the programme output?
Distances:
1 2 3 4 5
0 5 6 3 5
Path to 1:
-1
Path to 2:
-2
|-1
|-4
| |-1
Path to 3:
-3
|-2
| |-1
| |-4
| | |-1
Path to 4:
-4
|-1
Path to 5:
-5
|-4
| |-1
It first outputs the distances, and… yes! They’re correct.
Next, it prints those ASCII art drawings. They not drawings. They’re trees with the destination as root and the leafs as the source. To read a path from such a tree, start at a leaf (always 1) and go left, reading the first numbers you can see above.
Let’s find the paths to node 3. There are two leafs, so there are two paths of minimal length. The first one is 1 -> 4 -> 2 -> 3. The second one is 1 -> 2 -> 3. Check on the graph.
That’s it. If you’re up to a challenge, implement prev as an array of linked lists.
Good luck. Always open to comments.
2008-02-17 at 8:38
Nice!
Btw, how did you generate the graph figure? Was that some LaTeX package?
2008-03-09 at 5:05
Hi,
Can u send me a C program to find all possible routes. Urgent
2008-03-09 at 17:02
Hi,
I need name of the algorithm which can find all possible routes for a node pair(source,destination)….
2009-01-28 at 17:02
Hi,
thank you very much – great code! :-)
Just one minor remark: Is there a memory leak? If I look at line 48, 56, 58, and 64 – the for-loops run from 1 to n. C-Arrays indices should run from 0 to n-1, as far as I know. So, i.e., accessing visited[n] should cause problems. Maybe I’m wrong, but when trying to use this code with dynamically allocated C-Arrays, it caused segmentation faults. Running the loops from 0 to n-1 fixed that.
2009-02-11 at 2:53
You will have a pleasant trip.vietnam war xnfwloriginal wwii fixed bale helmet used vietnam rkmmjpilot survival knife sheath camillus 1967 unissued vqjnpfixed blade knives uphej1963 viet nam hmm 261 marine helicopter squadron patch mlgeegarand belt olive drab 1970s dated unissued gxaxkAnkle yqbwmasult costumes queen hearts size ultimate collection kjeipProfessional Massage Equipment bighsRacing Seats aeosk[link=http:/2ndfleet.net/entry.php?w=daleantell&e_id=24308]va192 golden dragons flight jacket squadron patch anti jazsn[/link][link=http:/www.iwuvu.com/trevorstoler/23196/Crepes+De+L%26%23039%3Barmorique+%28Les%29.html]vietnam war xmqfi[/link][link=http:/www.iwuvu.com/trevorstoler/23196/Crepes+De+L%26%23039%3Barmorique+%28Les%29.html]vietnam war kzwdz[/link][link=http://angplanz1974.hockeydisciples.com/2009/02/10/george-santayana-famous-quote/]marbles spear point cowboy bowie hunting knife w case yfmdd[/link][link=http:/www.bizzyblogz.com/stanleywhitesell/41466/Restaurant+Cambodiana.html]vietnam war aiqpw[/link][link=http:/www.bizzyblogz.com/stanleywhitesell/41466/Restaurant+Cambodiana.html]garand belt olive drab 1970s dated unissued gxaxk[/link][link=http://del.icio.us/MarZarHU1985]Ankle yqbwm[/link][link=http://aarevepr1983.hostsexblog.com/2009/02/09/rss-feed-for-discussions-into-the-history-as-well-as-the-ceremonies-involved-in-the-practice-of-wiccan-magic/]asult costumes queen hearts size ultimate collection kjeip[/link][link=http:/bloghoster.nl/alexcofran/123567/Putman+County+Airport+Airport+Information.html]Professional Massage Equipment bighs[/link][link=http:/bloghoster.nl/alexcofran/123567/Putman+County+Airport+Airport+Information.html]Racing Seats aeosk[/link][url=http:/2ndfleet.net/entry.php?w=daleantell&e_id=24308]vietnam war xnfwl[/url][url=http:/www.iwuvu.com/trevorstoler/23196/Crepes+De+L%26%23039%3Barmorique+%28Les%29.html]original wwii fixed bale helmet used vietnam rkmmj[/url][url=http:/www.iwuvu.com/trevorstoler/23196/Crepes+De+L%26%23039%3Barmorique+%28Les%29.html]pilot survival knife sheath camillus 1967 unissued vqjnp[/url][url=http://angplanz1974.hockeydisciples.com/2009/02/10/george-santayana-famous-quote/]fixed blade knives uphej[/url][url=http:/www.bizzyblogz.com/stanleywhitesell/41466/Restaurant+Cambodiana.html]1963 viet nam hmm 261 marine helicopter squadron patch mlgee[/url][url=http:/www.bizzyblogz.com/stanleywhitesell/41466/Restaurant+Cambodiana.html]garand belt olive drab 1970s dated unissued gxaxk[/url][url=http://del.icio.us/MarZarHU1985]Ankle yqbwm[/url][url=http://aarevepr1983.hostsexblog.com/2009/02/09/rss-feed-for-discussions-into-the-history-as-well-as-the-ceremonies-involved-in-the-practice-of-wiccan-magic/]halloween iemvv[/url][url=http:/bloghoster.nl/alexcofran/123567/Putman+County+Airport+Airport+Information.html]Professional Massage Equipment bighs[/url][url=http:/bloghoster.nl/alexcofran/123567/Putman+County+Airport+Airport+Information.html]Racing Seats aeosk[/url]
2009-02-21 at 7:59
i want to find all possible path from source to destination without the constraint of shortest distance
2009-03-26 at 23:43
plz send me C ode to find all possile routes between particular source and destination
2009-05-23 at 22:55
It’s fantastic.
Could you teach me how to print all the possilbe paths with real node number instead “|”?
Please send me the code to do that.
Thank you very much.
2009-06-26 at 18:18
Why do you start your for loop at 1?