Vous êtes sur la page 1sur 3

/* PRIGRAM TO FIND ALL SOURCE SHORTEST PATH USING DIJKSTRA'S ALGORITHM */

#include<stdio.h>
#include<stdlib.h>

void AdjacencyMatrix( int a[ ][ 100 ], int n, FILE *fp ){ /* GET ADJACENCY MATRIX
OF SIZE N X N */

int i , j ;

for(i = 0; i < n; i++)


{
for(j = 0;j < i; j++)
{
a[ i ][ j ] = rand( ) % 100; /* GENERATE RANDOM NUMBERS */
a[ j ][ i ] = rand( ) % 50;
}
a[ i ][ i ] = 0;
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if( a[ i ][ j ] != 0)
fprintf( fp, "%d -> %d\n", i, j); /* WRITE TO FILE */
}
}
}

void dijkastra( int n, int a[ ][ 100 ],int source,int des, int *d,int *p,int *s)
{ /* FIND SHORTEST PATH FROM SOURCE TO DESTINATION */

int i, j, u, v, min; /* LOCAL VARIABLES */

for(i = 0; i < n; i++) /* INITIALIZE ALL ARRAYS */


{
d[ i ] = a[ source ][ i ];
s[ i ] = 0;
p[ i ] = source;
}

s[ source ] = 1; /* INITIALIZE S[SOURCE] TO 1 */

for(i = 1; i < n;i++)


{
min = 99;
u =- 1;
for(j = 0; j < n; j++)
{
if(s[ j ] == 0) /* IF NODE NOT VISITED */
{
if(d[ j ] < min) /* IS ANY DIRECT PATH FROM SOURCE TO DESTINATION */
{
min = d[ j ]; /* IF TRUE CHANGE MIN TI d[j] */
u = j;
}
}
}
}
if(u == -1) return ; /* IF DESTINATION IS REACHED THE RETURN FROM FUNCTION*/

s[ u ] = 1; /* MARK u AS VISITED */

if( u == des) return;

for( v = 0; v < n; v++) /* CONSIDER U AS INTERMIDIATE NODE AND GO TO NEXT */


{
if(s[ v ] == 0) /* V WHICH IS REACHABLE FROM U */
{
if(d[ u ] + a[ u ][ v ] < d[ v ])
{
d[ v ] = d[ u ] + a[ u ][ v ]; /* CHANGE SHORTEST DISTANCE */
p[ v ] = u;
}
}
}
}

void print(int a[ ][ 100 ],int n,int *d,int *p,int *s){ /* FUNCTION TO PRINT
SHORTEST PATH FROM ALL SOURCES */

int i,source,des;

for(source = 0; source < n; source++) /* SOURCE VARIES FROM 0 TO N */


{
for(des = 0;des < n; des++) /* DESTINATION VARIES FROM 0 TO N */
{
dijkastra( n, a, source, des, d, p, s); /* CALL FUNCTION TO FIND SHORTEST PATH FROM
SOURCE */
{ /* TO DESTINATION */
if(d[ des ] == 99) /* IF NO PATH FROM GIVEN SOURCE TO DESTINATION */

printf("destination is not reachable from %d to %d \n",source,des);

else
{
printf("\n");
i = des;
while( i != source) /* REPEATEDLY PRINT PATH FROM SOURCE TO DESTINATION */
{
printf("%d<-", i);
i = p[ i ];
}

printf("%d of lenght %d\n", i, d[ des ]);


}
}
}
}
}

void printArray(int a[][100],int n){ /* DISPLAY THE MATRIX */

int i, j;
for(i = 0;i < n; i++)
{
for(j = 0;j < n; j++)
{
printf("\t%d", a[ i ][ j ]);
}
printf("\n");
}
}

int main()
{
int n,a[100][100],i,j,*p,*d,*s;

FILE *fp=fopen("amatrix.dot","w"); /* FILE POINTER TO WRITE THE ADJACENCY MATRIX */

fprintf(fp,"digraph A {\n");

printf("Enter the no vertices of the digraph\n");


scanf("%d",&n); /* READ REQUIRED NUMBER OF VERTICES IN THE DIGRAPH */

s = (int *) malloc (n * sizeof(int)); /* ALLOCATE MEMORY */


d = (int *) malloc (n * sizeof(int));
p = (int *) malloc (n * sizeof(int));

AdjacencyMatrix( a, n, fp);

printf("\t\tAdjacency Matrix of the graph\n"); /* PRINT ADJACENCY MATRIX */

printArray(a,n);

print(a,n,d,p,s);

fprintf(fp,"\n}\n\n");

fclose( fp ); /* CLOSE FILE */

return 0;

Vous aimerez peut-être aussi