Discovery Time and Finishing Time Code:
//dfs using adjacency list in directed graph #include<iostream> using namespace std; int WHITE=1,GREY=2,BLACK=3,INF=310000,NIL=-1; int num_v,num_e,time=0; int adj[20][20],color[20],p[20],d[20],f[20]; void DFS_visit(int); void initialization() { int k,j; for(k=0; k<20; k++) { for(j=0; j<20; j++) { adj[k][j]=0; } } } void build_adj_matrix() { int i,a,b; cout<<"Enter number of vertices: "<<endl; cin>>num_v; cout<<"Enter number of edges: "<<endl; cin>>num_e; cout<<"Enter edges: "<<endl; for(i=1; i<=num_e; i++) { cin>>a>>b; adj[a][b]=1; } } void dfs() { int i,u; for(i=1; i<=num_v; i++) { color[i]=WHITE; p[i]=NIL; } for(u=1; u<=num_v; u++) { if(color[u]==WHITE) { DFS_visit(u); } } } void DFS_visit(int u) { int i,v; color[u]=GREY; time=time+1; d[u]=time; for(v=1; v<=num_v; v++) { if(adj[u][v]==1) { if(color[v]==WHITE) { p[v]=u; DFS_visit(v); } } } color[u]=BLACK; time=time+1; f[u]=time; } void distance_output() { int i; cout<<"Discovery time and finish time:\n"; for(i=1; i<=num_v; i++) { cout<<"Node "<<i<<" is "<<d[i]<<"/"<<f[i]<<" \n"; } } int main() { initialization(); build_adj_matrix(); dfs(); distance_output(); return 0; }
input/output:
Enter number of vertices: 4 Enter number of edges: 4 Enter edges: 2 3 2 1 1 4 3 4 Discovery time and finish time: Node 1 is 1/4 Node 2 is 5/8 Node 3 is 6/7 Node 4 is 2/3
pseudo:
void DFS_visit(int u){ int i,v; colour[u]=GREY; time=time+1; d[u]=time; for(v=1;v<=num_v;v++) { if(adj[u][v]==1){ if(color[v]==WHITE){ p[v]=u; DFS_visit(v); } } } color[u]=BLACK; time=time+1; f[u]=time; }
Pseudocode from shafayet vai’s blog:
procedure DFS(G, source): U ← source time ← time+1 d[u] ← time color[u] ← GREY for all edges from u to v in G.adjacentEdges(v) do if color[v] = WHITE DFS(G,v) end if end for color[u] ← BLACK time ← time+1 f[u] ← time return
Reference:
http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm
http://www.dotnetlovers.com/Article/182/implementation-of-depth-first-searchdfs
Another code to find the order of the node:
References:
One of my classmates blog link: http://programminghelpbd.blogspot.com/2014/06/breadth-first-search-dfs-in-java.html
and this ppt : https://drive.google.com/file/d/0B0sCkwd_qKgJZEJzS1pWeXNmNUE/edit
CLRS website: http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm
Shafayet Ashraf: http://www.shafaetsplanet.com/planetcoding/?p=973
saurabhschool youtube link : https://www.youtube.com/watch?v=gCNsAKkUHPM
Youtube video of Mifta Sintaha:
and here is also a good implementation:
http://electrofriends.com/source-codes/software-programs/cpp-programs/cpp-data-structure/c-programs-for-the-implementation-of-depth-first-searchdfs-for-a-given-graph/comment-page-1/#comments
Java array basics: http://www.tutorialspoint.com/java/java_arrays.htm
Another code to find the order of vertices:
#include<iostream> #include<conio.h> #include<stdlib.h> using namespace std; int adj[10][10],i,j,k,n,stk[10],top,v,visit[10],visited[10]; main() { int m; cout <<"enterno of vertices"; cin >> n; cout <<"ente no of edges"; cin >> m; cout <<"\nEDGES \n"; for(k=1; k<=m; k++) { cin >>i>>j; adj[i][j]=1; } cout <<"enter initial vertex:"; cin >>v; cout <<"ORDER OF VISITED VERTICES: "; cout << v <<" "; visited[v]=1; k=1; while(k<n) { for(j=n; j>=1; j--) if(adj[v][j]!=0 && visited[j]!=1 && visit[j]!=1) { visit[j]=1; stk[top]=j; top++; } v=stk[--top]; cout<<v << " "; k++; visit[v]=0; visited[v]=1; } }