http://www.geeksforgeeks.org/iterative-depth-first-traversal/
Also check http://massivealgorithms.blogspot.com/2014/12/bfs-dfs-java.html
Depth First Traversal for a Graph | GeeksforGeeks
To avoid processing a node more than once, we use a boolean visited array.
http://www.cs.ucf.edu/~dmarino/progcontests/modules/graph1/DFS_BFS.java
http://cs-people.bu.edu/kvodski/teaching/spring10/solutions/DFS.java
DFS for all nodes:
https://github.com/lgrcyanny/Algorithm/blob/master/src/com/algorithm/graph/GraphDFS.java
Java code http://algs4.cs.princeton.edu/41undirected/DepthFirstSearch.java.html
Iterative Version
http://algs4.cs.princeton.edu/41undirected/NonrecursiveDFS.java
http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/Graph/dfs.html
http://stackoverflow.com/questions/21508765/how-to-implement-depth-first-search-for-graph-with-non-recursive-aprroach
http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/
Iterative Depth First Traversal of Graph
Breadth First Traversal for a Graph
Read full article from Depth First Traversal for a Graph | GeeksforGeeks
Depth First Traversal (or Search) for a graph is similar to Depth First Traversal (DFS) of a tree. The only catch here is, unlike trees, graphs may contain cycles, so we may come to the same node again. To avoid processing a node more than once, we use a boolean visited array.
Also check http://massivealgorithms.blogspot.com/2014/12/bfs-dfs-java.html
Depth First Traversal for a Graph | GeeksforGeeks
To avoid processing a node more than once, we use a boolean visited array.
http://www.cs.ucf.edu/~dmarino/progcontests/modules/graph1/DFS_BFS.java
http://cs-people.bu.edu/kvodski/teaching/spring10/solutions/DFS.java
DFS for all nodes:
void DFS()
{
boolean[] V=new boolean[N]; // a visited array to mark which vertices have been visited while doing the DFS
int numComponets=0; // the number of components in the graph
// do the DFS from each node not already visited
for (int i=0; i<N; ++i)
if (!V[i])
{
++numComponets;
System.out.printf("Starting a DFS for component %d starting at node %d%n",numComponets,i);
DFS(i,V);
}
}
void DFS(int at, boolean[] V)
{
// mark that we are visiting this node
V[at]=true;
for (int i=0; i<N; ++i)
if (G[at][i] && !V[i])
{
System.out.printf("Going to node %d...",i);
DFS(i,V);
}
}
https://github.com/lgrcyanny/Algorithm/blob/master/src/com/algorithm/graph/GraphDFS.java
Java code http://algs4.cs.princeton.edu/41undirected/DepthFirstSearch.java.html
public class DepthFirstSearch { private boolean[] marked; // marked[v] = is there an s-v path? private int count; // number of vertices connected to s * @param s the source vertex */ public DepthFirstSearch(Graph G, int s) { marked = new boolean[G.V()]; dfs(G, s); } // depth first search from v private void dfs(Graph G, int v) { count++; marked[v] = true; for (int w : G.adj(v)) { if (!marked[w]) { dfs(G, w); } } }}
Iterative Version
http://algs4.cs.princeton.edu/41undirected/NonrecursiveDFS.java
http://www.mathcs.emory.edu/~cheung/Courses/323/Syllabus/Graph/dfs.html
http://stackoverflow.com/questions/21508765/how-to-implement-depth-first-search-for-graph-with-non-recursive-aprroach
void dfs(GraphNode node) {
// sanity check
if (node == null) {
return;
}
// use a hash set to mark visited nodes
Set<GraphNode> set = new HashSet<GraphNode>();
// use a stack to help depth-first traversal
Stack<GraphNode> stack = new Stack<GraphNode>();
stack.push(node);
while (!stack.isEmpty()) {
GraphNode curr = stack.pop();
// current node has not been visited yet
if (!set.contains(curr)) {
// visit the node
// ...
// mark it as visited
set.add(curr);
}
for (int i = 0; i < curr.neighbors.size(); i++) {
GraphNode neighbor = curr.neighbors.get(i);
// this neighbor has not been visited yet
if (!set.contains(neighbor)) {
stack.push(neighbor);
}
}
}
}
https://gist.github.com/gennad/791932We can avoid using recursion by pushing active nodes onto a stackpublic void dfs() {// DFS uses Stack data structureStack stack = new Stack();stack.push(this.rootNode);rootNode.visited=true;printNode(rootNode);while(!stack.isEmpty()) {Node node = (Node)s.peek();Node child = getUnvisitedChildNode(n);if(child != null) {child.visited = true;printNode(child);s.push(child);}else {s.pop();}}// Clear visited property of nodesclearNodes();}
dfs() { pick a node x.... push(x); visited[x] = true; while ( stack != empty ) { n = node at stack top (peek only); nextNode = an unvisited node adjacent to n; if ( nextNode exists ) { visited[nextNode] = true; push(nextNode); // Process this node first } else { /* ----------------------------------------------------- Node at top of stack has no unvisited neighbor nodes ----------------------------------------------------- */ pop(); // Move on to the next node on the stack } } }
public class NonrecursiveDFS { private boolean[] marked; // marked[v] = is there an s-v path? public NonrecursiveDFS(Graph G, int s) { marked = new boolean[G.V()]; // to be able to iterate over each adjacency list, keeping track of which // vertex in each adjacency list needs to be explored next Iterator<Integer>[] adj = (Iterator<Integer>[]) new Iterator[G.V()]; for (int v = 0; v < G.V(); v++) adj[v] = G.adj(v).iterator(); // depth-first search using an explicit stack Stack<Integer> stack = new Stack<Integer>(); marked[s] = true; stack.push(s); while (!stack.isEmpty()) { int v = stack.peek(); if (adj[v].hasNext()) { int w = adj[v].next(); if (!marked[w]) { // discovered vertex w for the first time marked[w] = true; // edgeTo[v] = w; stack.push(w); } } else { // v's adjacency list is exhausted stack.pop(); } } }}
http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/
class Graph{ private int V; // No. of vertices // Array of lists for Adjacency List Representation private LinkedList<Integer> adj[]; // Constructor Graph(int v) { V = v; adj = new LinkedList[v]; for (int i=0; i<v; ++i) adj[i] = new LinkedList(); } //Function to add an edge into the graph void addEdge(int v, int w) { adj[v].add(w); // Add w to v's list. } // A function used by DFS void DFSUtil(int v,boolean visited[]) { // Mark the current node as visited and print it visited[v] = true; System.out.print(v+" "); // Recur for all the vertices adjacent to this vertex Iterator<Integer> i = adj[v].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) DFSUtil(n,visited); } } // The function to do DFS traversal. It uses recursive DFSUtil() void DFS() { // Mark all the vertices as not visited(set as // false by default in java) boolean visited[] = new boolean[V]; // Call the recursive helper function to print DFS traversal // starting from all vertices one by one for (int i=0; i<V; ++i) if (visited[i] == false) DFSUtil(i, visited); }}class Graph{ int V; // No. of vertices list<int> *adj; // Pointer to an array containing adjacency listsvoid Graph::DFSUtil(int v, bool visited[]){ // Mark the current node as visited and print it visited[v] = true; cout << v << " "; // Recur for all the vertices adjacent to this vertex list<int>::iterator i; for(i = adj[v].begin(); i != adj[v].end(); ++i) if(!visited[*i]) DFSUtil(*i, visited);}// DFS traversal of the vertices reachable from v. It uses recursive DFSUtil()void Graph::DFS(int v){ // Mark all the vertices as not visited bool *visited = new bool[V]; for(int i = 0; i < V; i++) visited[i] = false; // Call the recursive helper function to print DFS traversal DFSUtil(v, visited);}// prints all not yet visited vertices reachable from svoid Graph::DFSUtil(int s, bool visited[]){ // Create a stack for DFS stack<int> stack; // Mark the current node as visited and push it visited[s] = true; stack.push(s); // 'i' will be used to get all adjacent vertices // of a vertex list<int>::iterator i; while (!stack.empty()) { // Pop a vertex from stack and print it s = stack.top(); cout << s << " "; stack.pop(); // Get all adjacent vertices of the popped vertex s // If a adjacent has not been visited, then mark it // visited and push it to the stack for (i = adj[s].begin(); i != adj[s].end(); ++i) { if (!visited[*i]) { visited[*i] = true; stack.push(*i); } } }}// prints all vertices in DFS mannervoid Graph::DFS(){ // Mark all the vertices as not visited bool *visited = new bool[V]; for (int i = 0; i < V; i++) visited[i] = false; for (int i = 0; i < V; i++) if (!visited[i]) DFSUtil(i, visited);} // prints BFS traversal from a given source s void BFS(int s) { // Mark all the vertices as not visited(By default // set as false) boolean visited[] = new boolean[V]; // Create a queue for BFS LinkedList<Integer> queue = new LinkedList<Integer>(); // Mark the current node as visited and enqueue it visited[s]=true; queue.add(s); while (queue.size() != 0) { // Dequeue a vertex from queue and print it s = queue.poll(); System.out.print(s+" "); // Get all adjacent vertices of the dequeued vertex s // If a adjacent has not been visited, then mark it // visited and enqueue it Iterator<Integer> i = adj[s].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) { visited[n] = true; queue.add(n); } } } }