- import java.util.ArrayList; 
- import java.util.HashMap; 
- import java.util.List; 
- import java.util.Map; 
- import java.util.Stack; 
-   
- /** 
-  * DFS traversal in a undirected Graph using Stack 
-  * @author Prateek 
-  * 
-  */ 
- class DFSIterative { 
-   
- 	private int numVertices; 
- 	private int numEdges; 
-   
- 	// Map to maintain adjacency List 
- 	private-  Map <Integer- , ArrayList <- Integer >>-  adjList ;
 
- 	// Map to maintain visit status 
- 	private-  Map <Integer- , Boolean >-  vistedStatus ;
 
-   
- 	/* 
- 	 * Constructor when number of vertices are not known 
- 	 */ 
- 	public DFSIterative() { 
- 		this- . adjList = new-  HashMap <Integer- , ArrayList <- Integer >>();
 
- 		this- . vistedStatus = new-  HashMap <Integer- , Boolean >();
 
- 	} 
-   
- 	/* 
- 	 * Constructor when number of vertices are known 
- 	 */ 
- 	public DFSIterative(int V) { 
- 		this.numVertices = V; 
- 		this- . adjList = new-  HashMap <Integer- , ArrayList <- Integer >>(- V );
 
- 		this- . vistedStatus = new-  HashMap <Integer- , Boolean >(- V );
 
- 	} 
-   
- 	/** 
- 	 * Edge in a un-directed graph 
- 	 */ 
- 	private void addEdge(int src, int dest) { 
-   
- 		/* Forward Edge */ 
- 		ArrayList<Integer> list = adjList.get(src); 
- 		if (list == null) 
- 			list = new ArrayList<Integer>(); 
-   
- 		list.add(dest); 
- 		adjList.put(src, list); 
- 		vistedStatus.put(src, false); // visit status set to false 
-   
- 		/* Reverse Edge */ 
- 		list = adjList.get(dest); 
- 		if (list == null) 
- 			list = new ArrayList<Integer>(); 
-   
- 		list.add(src); 
- 		adjList.put(dest, list); 
- 		vistedStatus.put(dest, false); // visit status set to false 
-   
- 	} 
-   
- 	/** 
- 	 * Procedure for Iterative DFS using Stack 
- 	 */ 
- 	public void dfsIterative(int startNode) { 
- 		System- . out- . println("Iterative DFS : ");
 
- 		Stack<Integer> stack = new Stack<Integer>(); 
-   
- 		stack.push(startNode); 
- 		vistedStatus.put(startNode, true); 
-   
- 		while (!stack.empty()) { 
-   
- 			int item = stack.pop(); 
-   
- 			System- . out- . println("Poped Item : " +-  item );
 
-   
- 			List<Integer> list = adjList.get(item); 
- 			int size = list.size(); 
-   
- 			for (int j = 0; j < size; j++) { 
- 				int dest = list.get(j); 
-   
- 				if (!vistedStatus.get(dest)) { 
- 					vistedStatus.put(dest, true); 
- 					stack.push(dest); 
- 				} 
- 			} 
- 		} 
- 	} 
-   
- 	public static void-  main (String[]-  args ) {
 
- 		DFSIterative g = new DFSIterative(6); 
-   
- 		g.addEdge(0, 1); 
- 		g.addEdge(0, 2); 
- 		g.addEdge(1, 2); 
- 		g.addEdge(2, 3); 
- 		g.addEdge(1, 3); 
-   
- 		g.dfsIterative(0); 
-   
- 	} 
- } 
-   
				aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5TdGFjazsKCi8qKgogKiBERlMgdHJhdmVyc2FsIGluIGEgdW5kaXJlY3RlZCBHcmFwaCB1c2luZyBTdGFjawogKiBAYXV0aG9yIFByYXRlZWsKICoKICovCmNsYXNzIERGU0l0ZXJhdGl2ZSB7CgoJcHJpdmF0ZSBpbnQgbnVtVmVydGljZXM7Cglwcml2YXRlIGludCBudW1FZGdlczsKCgkvLyBNYXAgdG8gbWFpbnRhaW4gYWRqYWNlbmN5IExpc3QKCXByaXZhdGUgTWFwPEludGVnZXIsIEFycmF5TGlzdDxJbnRlZ2VyPj4gYWRqTGlzdDsKCS8vIE1hcCB0byBtYWludGFpbiB2aXNpdCBzdGF0dXMKCXByaXZhdGUgTWFwPEludGVnZXIsIEJvb2xlYW4+IHZpc3RlZFN0YXR1czsKCgkvKgoJICogQ29uc3RydWN0b3Igd2hlbiBudW1iZXIgb2YgdmVydGljZXMgYXJlIG5vdCBrbm93bgoJICovCglwdWJsaWMgREZTSXRlcmF0aXZlKCkgewoJCXRoaXMuYWRqTGlzdCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEFycmF5TGlzdDxJbnRlZ2VyPj4oKTsKCQl0aGlzLnZpc3RlZFN0YXR1cyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEJvb2xlYW4+KCk7Cgl9CgoJLyoKCSAqIENvbnN0cnVjdG9yIHdoZW4gbnVtYmVyIG9mIHZlcnRpY2VzIGFyZSBrbm93bgoJICovCglwdWJsaWMgREZTSXRlcmF0aXZlKGludCBWKSB7CgkJdGhpcy5udW1WZXJ0aWNlcyA9IFY7CgkJdGhpcy5hZGpMaXN0ID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgQXJyYXlMaXN0PEludGVnZXI+PihWKTsKCQl0aGlzLnZpc3RlZFN0YXR1cyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEJvb2xlYW4+KFYpOwoJfQoKCS8qKgoJICogRWRnZSBpbiBhIHVuLWRpcmVjdGVkIGdyYXBoCgkgKi8KCXByaXZhdGUgdm9pZCBhZGRFZGdlKGludCBzcmMsIGludCBkZXN0KSB7CgoJCS8qIEZvcndhcmQgRWRnZSAqLwoJCUFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0ID0gYWRqTGlzdC5nZXQoc3JjKTsKCQlpZiAobGlzdCA9PSBudWxsKQoJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwoKCQlsaXN0LmFkZChkZXN0KTsKCQlhZGpMaXN0LnB1dChzcmMsIGxpc3QpOwoJCXZpc3RlZFN0YXR1cy5wdXQoc3JjLCBmYWxzZSk7IC8vIHZpc2l0IHN0YXR1cyBzZXQgdG8gZmFsc2UKCgkJLyogUmV2ZXJzZSBFZGdlICovCgkJbGlzdCA9IGFkakxpc3QuZ2V0KGRlc3QpOwoJCWlmIChsaXN0ID09IG51bGwpCgkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7CgoJCWxpc3QuYWRkKHNyYyk7CgkJYWRqTGlzdC5wdXQoZGVzdCwgbGlzdCk7CgkJdmlzdGVkU3RhdHVzLnB1dChkZXN0LCBmYWxzZSk7IC8vIHZpc2l0IHN0YXR1cyBzZXQgdG8gZmFsc2UKCgl9CgoJLyoqCgkgKiBQcm9jZWR1cmUgZm9yIEl0ZXJhdGl2ZSBERlMgdXNpbmcgU3RhY2sKCSAqLwoJcHVibGljIHZvaWQgZGZzSXRlcmF0aXZlKGludCBzdGFydE5vZGUpIHsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIkl0ZXJhdGl2ZSBERlMgOiAiKTsKCQlTdGFjazxJbnRlZ2VyPiBzdGFjayA9IG5ldyBTdGFjazxJbnRlZ2VyPigpOwoKCQlzdGFjay5wdXNoKHN0YXJ0Tm9kZSk7CgkJdmlzdGVkU3RhdHVzLnB1dChzdGFydE5vZGUsIHRydWUpOwoKCQl3aGlsZSAoIXN0YWNrLmVtcHR5KCkpIHsKCgkJCWludCBpdGVtID0gc3RhY2sucG9wKCk7CgoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlBvcGVkIEl0ZW0gOiAiICsgaXRlbSk7CgoJCQlMaXN0PEludGVnZXI+IGxpc3QgPSBhZGpMaXN0LmdldChpdGVtKTsKCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKCgkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CgkJCQlpbnQgZGVzdCA9IGxpc3QuZ2V0KGopOwoKCQkJCWlmICghdmlzdGVkU3RhdHVzLmdldChkZXN0KSkgewoJCQkJCXZpc3RlZFN0YXR1cy5wdXQoZGVzdCwgdHJ1ZSk7CgkJCQkJc3RhY2sucHVzaChkZXN0KTsKCQkJCX0KCQkJfQoJCX0KCX0KCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJREZTSXRlcmF0aXZlIGcgPSBuZXcgREZTSXRlcmF0aXZlKDYpOwoKCQlnLmFkZEVkZ2UoMCwgMSk7CgkJZy5hZGRFZGdlKDAsIDIpOwoJCWcuYWRkRWRnZSgxLCAyKTsKCQlnLmFkZEVkZ2UoMiwgMyk7CgkJZy5hZGRFZGdlKDEsIDMpOwoKCQlnLmRmc0l0ZXJhdGl2ZSgwKTsKCgl9Cn0K