/* 10(a). W.A.P. to find shortest path from single vertex to all other paths in a digraph (Dijikstra's Algorithm) */
#include<stdio.h>
#include<conio.h>
int n,cnt=1;
void Dijikstra(int a[10][10],int dst,int p[],int d[10],int visited[10])
{
int i,j,v,u,min;
for (j = 1; j <= n-1; j++)
{
min = 999;
u = 0;
for (i = 1; i <= n; i++)
if ((visited[i] == 0) && (d[i] <= min))
{
min = d[i];
u = i;
}
if (u == dst)
break;
visited[u] = 1;
for (v = 1; v <= n; v++)
if ((visited[v] == 0) && (d[u] + a[u][v] < d[v]))
{
d[v] = d[u] + a[u][v];
p[v] = u;
}
}
}
void main()
{
int i,j,u,x[10],a[10][10],src,d[10],s[10],p[10],dst,k;
clrscr();
printf("Enter no. of nodes : ");
scanf("%d",&n);
printf("\nEnter the cost matrix :\n");
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
scanf("%d",&a[i][j]);
if (a[i][j] == 0)
a[i][j] = 999;
}
printf("\nEnter the source vertex : ");
scanf("%d",&src);
for (k = 1; k <= n; k++)
{
for (i = 1; i <= n; i++)
{
d[i] = a[src][i]; // Initialize array d with the costs
p[i] = src;
s[i] = 0; // No vertex selected yet
}
s[src] = 1; // Starting from the source vertex
Dijikstra(a,k,p,d,s);
if (d[k] == 999)
printf("\nNo path from %d to %d\n",src,k);
else
{
printf("\n\nShortest distance from %d to %d is %d",src,k,d[k]);
printf("\nShortest path is :\n");
i = k;
while(i != src)
{
printf("%d<--",i);
i = p[i];
}
printf("%d",i);
}
}
getch();
}
/* OUTPUT
Enter no. of nodes : 3
Enter the cost matrix :
7 0 2
3 8 9
5 4 6
Enter the source vertex : 1
Shortest distance from 1 to 1 is 7
Shortest path is :
1
Shortest distance from 1 to 2 is 6
Shortest path is :
2<--3<--1
Shortest distance from 1 to 3 is 2
Shortest path is :
3<--1
*/