Saturday, September 3, 2011

SFS and BFS on Graph


/*DFS and BFS on graph represented using adjacency list */

#include<stdio.h>
#include<stdlib.h>
#define MAX 20

typedef struct Q
{
int data[MAX];
int R,F;
}Q;

typedef struct node
{
struct node *next;
int vertex;
}node;

void enqueue(Q *,int);
int dequque(Q *);
int empty(Q *);
int full(Q *);
void BFS(int);
void readgraph();     //create an adjecency list
void insert(int vi,int vj);     //insert an edge (vi,vj)in adj.list
void DFS(int i);
int visited[MAX];
node *G[20];         //heads of the linked list
int n;               // no of nodes

int main()
{
int i,op;
do
 { printf("\n\n1)Create\n2)BFS\n3)DFS\n4)Quit");
   printf("\nEnter Your Choice: ");
   scanf("%d",&op);
   switch(op)
    { case 1: readgraph();break;
      case 2: printf("\nStarting Node No. : ");
      scanf("%d",&i);
      BFS(i);break;
      case 3:  for(i=0;i<n;i++)
visited[i]=0;
      printf("\nStarting Node No. : ");
      scanf("%d",&i);
      DFS(i);break;
     }
  }while(op!=4);
}


void BFS(int v)
{
int w,i,visited[MAX];
Q q;

node *p;
q.R=q.F=-1;              //initialise
for(i=0;i<n;i++)
visited[i]=0;
enqueue(&q,v);
printf("\nVisit\t%d",v);
visited[v]=1;
while(!empty(&q))
{
v=dequeue(&q);
//insert all unvisited,adjacent vertices of v into queue
for(p=G[v];p!=NULL;p=p->next)
{
w=p->vertex;
if(visited[w]==0)
{
enqueue(&q,w);
visited[w]=1;
printf("\nvisit\t%d",w);
}
}
}
}

void DFS(int i)
{
node *p;
int stack[10],top=-1;
stack[++top]=i;
while(top != -1)
{
i=stack[top--];
if(!visited[i])
   {
visited[i]=1;
printf("%d   ",i);
for(p=G[i];p!=NULL;p=p->next)
if(!visited[p->vertex])
stack[++top]=p->vertex;
   }
}
 }

int empty(Q *P)
{
if(P->R==-1)
return(1);
return(0);
}

int full(Q *P)
{
if(P->R==MAX-1)

return(1);
return(0);
}

void enqueue(Q *P,int x)
{
if(P->R==-1)
{
P->R=P->F=0;
P->data[P->R]=x;
}
else
{
P->R=P->R+1;
P->data[P->R]=x;
}
}

int dequeue(Q *P)
{
int x;
x=P->data[P->F];
if(P->R==P->F)
{
P->R=-1;
P->F=-1;
}
else
P->F=P->F+1;
return(x);
}

void readgraph()
{ int i,j;
int adj[10][10];
printf("\nEnter no. of vertices :");
scanf("%d",&n);
printf("\nEnter Adjacency matrix :\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&adj[i][j]);
//initialise G[] with NULL
for(i=0;i<n;i++)
G[i]=NULL;

for(i=0;i<n;i++) //create adjacency list
for(j=0;j<n;j++)
      if(adj[i][j]!=0)
  insert(i,j);

}

void insert(int vi,int vj)
{
node *p,*q;
//acquire memory for the new node
q=(node *)malloc(sizeof(node));
q->vertex=vj;
q->next=NULL;
//insert the node in the linked list for the vertex no. vi
if(G[vi]==NULL)
G[vi]=q;
else
{
// go to the end of linked list
p=G[vi];
while(p->next!=NULL)
p=p->next;
p->next=q;
}
}

Graph


/*Indegree,Outdegree,total degree of each vertex and,
  BFS , DFS on a graph represented using adjacency matrix*/
#include<stdio.h>
#define MAX 10

typedef struct Q
{
int R,F;
int data[MAX];
}Q;

int empty(Q *P);
int full(Q *P);
void enqueue(Q *P,int x);
int dequeue(Q *P);
void BFS(int);
void DFS(int);
void degrees();
int G[MAX][MAX];
int n=0;
int visited[MAX];

void create()
 {
        int i,j;
printf("\nEnter no of vertices : ");
scanf("%d",&n);
printf("\nEnter the adjecendy matrix of  graph : ");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&G[i][j]);

 }


int main()
{
int i,j,v,op;

do{
  printf("\n1)Read the graph");
  printf("\n\n2)DFS\n3)BFS\n4)Indegree/Outdegree/Total degree\n5)QUIT");
  printf("\nEnter Your choice : ");
  scanf("%d",&op);
  switch(op)
   {
     case 1:create();break;
     case 2:printf("\nEnter the starting vertex for DFS : ");
    scanf("%d",&v);
    for(i=0;i<n;i++)
  visited[i]=0;
    DFS(v);break;
     case 3:printf("\nEnter the starting vertex for BFS : ");
    scanf("%d",&v);
    BFS(v);break;

     case 4: degrees();break;

   }
 }while(op!=5);

}

void BFS(int v)
{
int visited[MAX],i;
Q q;
q.R=q.F=-1;
for(i=0;i<n;i++)
 visited[i]=0;
enqueue(&q,v);
printf("\n visit\n",v);
visited[v]=1;
while(!empty(&q))
{
v=dequeue(&q);
// visit and add adjecency vertices
for(i=0;i<n;i++)
if(visited[i]==0 && G[v][i]!=0)
{
enqueue(&q,i);
visited[i]=1;
printf("\n%d",i);
}
}
}

int empty(Q *P)
{
if(P->R==-1)
return(1);
return(0);
}

int full(Q *P)
{
if(P->R==MAX-1)
return(1);
return(0);
}

void enqueue(Q *P,int x)
{
if(P->R==-1)
{
P->R=P->F=0;
P->data[P->R]=x;
}
else
{
P->R=P->R+1;
P->data[P->R]=x;
}
}

int dequeue(Q *P)
{
int x;
x=P->data[P->F];
if(P->R==P->F)
{
P->R=-1;
P->F=-1;
}
else
P->F=P->F+1;
return(x);
}

void DFS(int i)
{
int j;
printf("\n%d",i);
visited[i]=1;
for(j=0;j<n;j++)
if(!visited[j] && G[i][j]==1)
DFS(j);
}
void degrees()
 {
int idegree,odegree,i,j;
for(i=0;i<n;i++)
{
idegree=odegree=0;
for(j=0;j<n;j++)
 {
if(G[i][j]!=0)
odegree++;
if(G[j][i]!=0)
idegree++;
 }
printf("\nvertex : %d\tIndegree :%d\tOut degree:%d\tTotal Degree:%d",i,idegree,odegree,idegree+odegree);
}
 }