Saturday, January 11, 2014

BREADTH FIRST SEARCH of a GRAPH

/*A program to do breadth first search in a graph */

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int node_name;
int weight;
struct node *next;
}node;
node *graph;
typedef struct queue_list
{
int node_name;
struct queue_list *next;
}queue_list;

queue_list *queue = NULL,*queue_last=NULL;

int build_graph();
void print_graph(int size);
void breadth_first_search(int source_node);
int build_graph()
{
node *temp,*idx_graph;
int i,j,m,n;
//printf("Enter number of nodes in the graph\n");
scanf("%d",&n);
graph = (node*)malloc(sizeof(node)*n);
for(i=0;i<n;i++)
{  
graph[i].node_name = i+1;
graph[i].weight = -1;
graph[i].next=NULL;
//printf("Enter number of nodes connected to node %d\n",i+1);
scanf("%d",&m);
idx_graph = &graph[i];
//printf("Enter Node numbers connected to node %d\n",i+1);
for(j=0;j<m;j++)
{
temp = (node*)malloc(sizeof(node));
scanf("%d",&temp->node_name);
temp->weight =-1;
temp->next= NULL;
idx_graph->next = temp;
idx_graph = idx_graph->next;
}
}
return (n);
}

void print_graph(int size)
{
node *temp;
int i;
for(i=0;i<size;i++)
{
temp = &graph[i];
printf("%c/%d-> ",temp->node_name+'r'-1,temp->weight);
temp = temp->next;
while(temp)
{
printf("%c ",temp->node_name+'r'-1);
temp = temp->next;
}
printf("\n");
}
return;
}
void breadth_first_search(int source_node)
{
node *temp;
int weight= 0;
queue_list* queue_temp;

queue = (queue_list*)malloc(sizeof(queue_list));
queue->node_name = source_node;
queue->next = NULL;
queue_last = queue;
graph[queue->node_name-1].weight = 0;
while(queue !=NULL)
{
temp = graph[queue->node_name-1].next;
while(temp !=NULL)
{
if(graph[temp->node_name-1].weight ==-1)
{
/*Create new element */
queue_temp = (queue_list*)malloc(sizeof(queue_list));
queue_temp->node_name = temp->node_name;
queue_temp->next = NULL;

/*Add new element to the queue*/
queue_last->next = queue_temp;
queue_last = queue_temp;
/*update weight of all connected nodes*/
graph[temp->node_name-1].weight = graph[queue->node_name-1].weight+1;
}
temp = temp->next;
}
/*Free first element and move to next element in the queue*/
queue_temp = queue->next;
free(queue);
queue = queue_temp;
}
return;
}
main()
{
int size =0,source_node;
size = build_graph();
print_graph(size);
//printf("Enter Source node\n");
scanf("%d",&source_node);
if(source_node<=size)
{
breadth_first_search(source_node);
}
else
{
printf("Source node is out of graph size\n");
}
printf("\n");
print_graph(size);
getchar();
getchar();
return 0;
}