|
|
Depth First Search is one of the standard ways to traverse a graph . Depth First Search traversal is used by most of the Graph algorithms .
To keep track of the progress , the DFS also uses the same coloring scheme as described for BFS . In addition the DFS makes uses of a stack structure to maintain the order in which the vertices are to be processed , instead of queue
The below algorithm summarizes various steps required to implement the DFS
Also check : Threaded Binary Tree Structures
Final Words !
If I had missed anything please let me know through comments . Share the post with your friends through Facebook . Also share your idea through comments .
Depth First Search :
The Depth First Search ( DFS ) , as its name implies , is to search deeper in the graph , whenever possible . The edgesare explored out of the most recently discovered vertex v that still has unexplored edges leaving it . When all of V's edges have been explored , the search backtracks to explore edges leaving the vertex from which v was discovered . This process continues until we have disocvered all the vertices that are reachable from the source vertex . This algorithm also works on both directed as well as on undirected graphs .To keep track of the progress , the DFS also uses the same coloring scheme as described for BFS . In addition the DFS makes uses of a stack structure to maintain the order in which the vertices are to be processed , instead of queue
The below algorithm summarizes various steps required to implement the DFS
Depth First Search Iterative (adj,n,s):
Here adj is the adjacency list of the graph with n vertices , and vertex s is the source vertex . This algorithm uses a stack STACK , and linear array color of size n , to keep track of the progress of DFS . Its also uses local variables u and ptr .Also check : Threaded Binary Tree Structures
Depth First Search (DFS) Algorithm :
BEGIN
for i=1 to n by 1 do
set color[i]=WHITE
endfor
Set color[s]=GRAY
CALL createstack(stack)
Call push(stack,s)
while(Stack is not empty) do
Set u=peek(stack)
Set ptr=adj[u]
while(ptr!=NULL) do
if(color[prt->info]=WHITE) then
Set color[ptr->info]=GRAY
Call push(&stack,ptr->info)
Set u=ptr->info
Set ptr=adj[u]
else
Set ptr=ptr->next
endif
endwhile
Call pop(&stack,u)
Print :u
Set color[u]=BLACK
endwhile
End
Advantages of DFS :
- It doesn't required to store neighbouring nodes
- If DFS finds solution without exploring much in path then the time and space it takes will be very less .
Disadvantages of DFS :
- The disadvantage of DFS is that there is a possibility that it may go down the left most path forever . One solution to this problem is to impose a cutoff depth on the search .
- DFS is not guaranteed to find the solution .
- It never guaranteed to find a minimal solution if more than one solution exists .
Efficiency :
The time and space analysis of DFS differs according to its application area . DFS is used to traverse an entire graph and takes O(|V|+|E|) time . In these applications it also uses space O(|V|) in the worst case to store the stack of vertices on the current search path as well as the set of already visited vertices .Program for Depth First Search in C :
#include<stdio.h>
#include<conio.h>
#define size 20
int a[10][10],vertex[10],n,e;
//STACK FUNCTIONS
#define bottom -1
int stack[size],top=bottom;
int stackempty()
{
return (top==bottom)?1:0;
}
int stackfull()
{
return (top==size-1)?1:0;
}
void push(int item)
{
if(stackfull())
printf("Stack is full");
else
stack[++top]=item;
}
int pop()
{
if(stackempty())
{
printf("Stack is empty");
return -1;
}
else
return stack[top--];
}
int peep()
{
if(stackempty())
{
printf("Stack is empty");
return -1;
}
else
return stack[top];
}
//j is unvisited adjacent vertex to i
int adjvertex(int i)
{
int j;
for(j=0;j<n;j++)
if(a[i][j]==1&&vertex[j]==0)
return j;
return n;
}
int visitall()
{
int i;
for(i=0;i<n;i++)
if(vertex[i]==0)
return 0;
return 1;
}
//function for DFS
void dfs()
{
int i,j,k,cur=0;
for(i=0;i<n;i++)
vertex[i]=0;
printf("DFS path => V%d",cur+1);
push(cur);
vertex[cur]=1;
while(!visitall())
{
do
{
cur=adjvertex(peep());
if(cur==n) pop();
}
while(cur==n&&!stackempty());
if(stackempty())
{
printf("Graph is disconnected");
break;
}
if(cur!=n)
{
printf("V%d",cur+1);
push(cur);
vertex[cur]=1;
}
}
}
void main()
{
int i,j,k;
clrscr();
for(i=0;i<10;i++)
for(j=0;j<10;j++)
a[i][j]=0;
printf("Enter no. of vertices & edges of undirected graph:");
scanf("%d%d",&n,&e);
printf("Enter edges as pair of vertices");
for(k=1;k<=e;k++)
{
printf("Edge %d =>",k);
scanf("%d%d",&i,&j);
a[i-1][j-1]=1;
}
dfs();
getch();
}
Final Words !
If I had missed anything please let me know through comments . Share the post with your friends through Facebook . Also share your idea through comments .

0 comments:
Post a Comment