Monday, August 11, 2014

Dijkstra's algorithm for finding shortest path from source

/*DIJKSTRA's ALGORITHM*/
/* Following programs finds the shortest paths from a given node to all nodes in a graph*/
/*Make DEBUG 1 to get interactive program */
/*  Sample input
5 -> number of nodes
2 -> number of nodes conneceted to first node
1 10 2 5 -> node number, edge weight
2
4 1 2 2
3
4 9 3 2 1 3
2
4 6 0 7
1
3 4
2 ->source node
End */

/* Sample output

Shortest paths from Node2 are as below -
 Node0 => 9
 Node1 => 3
 Node2 => 0
 Node3 => 2
 Node4 => 4

End */

/*************** Program *************/
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 100
#define TRUE 1
#define FALSE 0
#define DEBUG 0
typedef struct graph
{
int node_num;
int edge_len;
struct graph *next;
}graph;
typedef struct path
{
int len;
int valid;
}path;
graph *root;
int creat_graph(void);
void print_graph(int size);
void dijkstra(int size);
main()
{
int size;
size = creat_graph();
#if DEBUG
print_graph(size);
#endif
dijkstra(size);
return 0;
}

int creat_graph(void )
{
int size,i,num,j;
graph *temp,*new_temp;
#if DEBUG
printf("Enter number of vertices \n");
#endif
scanf("%d",&size);

root = (graph*)malloc(size*sizeof(graph));
for(i=0;i<size;i++)
{
root[i].node_num = i;
root[i].edge_len = 0;
root[i].next =NULL;
#if DEBUG
printf("Enter number of nodes connected to node %d\n",i);
#endif
scanf("%d",&num);
temp = &root[i];
for(j=0;j<num;j++)
{
#if DEBUG
printf("Enter node_number and edge length connected to node %d",i);
#endif
new_temp = (graph*)malloc(sizeof(graph));
scanf("%d %d",&new_temp->node_num, &new_temp->edge_len);
new_temp->next = NULL;
temp->next = new_temp;
temp = temp->next;
}
}
return size;
}
#if DEBUG
void print_graph(int size)
{
int i;
graph *temp;
for(i=0;i<size;i++)
{
printf("%d = ",root[i].node_num);
temp = root[i].next;

while(temp!=NULL)
{
printf("> [%d/%d]",temp->node_num,temp->edge_len);
temp = temp->next;
}
printf("\n");
}
}
#endif
void dijkstra(int size)
{
 path *temp;
 graph* temp_node;
 int i,j,k,node,source_node;

temp = (path*)malloc(size*sizeof(path));
for(i=0;i<size;i++)
{
temp[i].len = 0xffff;
temp[i].valid = TRUE;
}
#if DEBUG
printf("Enter source node\n");
#endif
scanf("%d",&node);
source_node= node;
temp[node].len =0;

for(i=0;i<size-1;i++)
{
temp_node = root[node].next;
while(temp_node!=NULL)
{
if((temp[temp_node->node_num].valid) &&
(temp[temp_node->node_num].len > (temp_node->edge_len + temp[node].len)))
{
temp[temp_node->node_num].len = (temp_node->edge_len + temp[node].len);
}
temp_node = temp_node->next;
}
temp[node].valid = FALSE;

for(j=0;j<size ;j++)
{
if(temp[j].valid)
{
node =j;
break;
}
}
for(k=j+1;k<size;k++)
{
if(temp[k].valid && temp[k].len < temp[node].len)
{
node = k;
}
}
#if DEBUG
for(j=0;j<size;j++)
{
printf("%d ", temp[j].len);
}
printf("- Itr %d \n",i);
#endif
}
printf("Shortest paths from Node%d are as below -\n ",source_node);
for(j=0;j<size;j++)
{
printf(" Node%d => %d\n ",j,temp[j].len);
}

}
/************* END ***********************/