- import java.util.ArrayList; 
- import java.util.LinkedList; 
- import java.util.List; 
- import java.util.Queue; 
- import java.util.Stack; 
-   
- /** 
-  * Implementation of a directed unweighted Graph using Adjacency Matrix 
-  *  
-  * Complexity: addEdge, removeEdge, hasEdge O(1) / outEdges, inEdges O(n) / 
-  * Space O(n^2) 
-  */ 
- class AdjMatrixGraph { 
- 	int size; 
- 	private boolean[][] matrix; 
- 	public static final byte WHITE = 1; 
- 	public static final byte GREY = 2; 
-   
- 	public AdjMatrixGraph(int size) { 
- 		this.size = size; 
- 		this.matrix = new boolean[size][size]; 
- 	} 
-   
- 	public void addEdge(int nodeA, int nodeB) { 
- 		matrix[nodeA][nodeB] = true; 
- 	} 
-   
- 	public void removeEdge(int nodeA, int nodeB) { 
- 		matrix[nodeA][nodeB] = false; 
- 	} 
-   
- 	public boolean hasEdge(int nodeA, int nodeB) { 
- 		return matrix[nodeA][nodeB]; 
- 	} 
-   
- 	public List<Integer> outEdges(int i) { 
- 		List<Integer> edges = new ArrayList<Integer>(); 
- 		for (int j = 0; j < size; j++) { 
- 			if (matrix[i][j]) { 
- 				edges.add(j); 
- 			} 
- 		} 
- 		return edges; 
- 	} 
-   
- 	public List<Integer> inEdges(int i) { 
- 		List<Integer> edges = new ArrayList<Integer>(); 
- 		for (int j = 0; j < size; j++) { 
- 			if (matrix[j][i]) { 
- 				edges.add(j); 
- 			} 
- 		} 
- 		return edges; 
- 	} 
-   
- 	public int nVertices() { 
- 		return size; 
- 	} 
-   
- 	public void breadthFirstSearch(int root) { 
- 		boolean[] seen = new boolean[nVertices()]; 
- 		Queue<Integer> q = new LinkedList<Integer>(); 
- 		q.add(root); 
- 		seen[root] = true; 
- 		while (!q.isEmpty()) { 
- 			int i = q.remove(); 
- 				if (!seen[j]) { 
- 					q.add(j); 
- 					seen[j] = true; 
- 				} 
- 			} 
- 		} 
- 	} 
-   
- 	public void depthFirstSearch(int r) { 
- 		byte[] c = new byte[nVertices()]; 
- 		Stack<Integer> s = new Stack<Integer>(); 
- 		s.push(r); 
- 		while (!s.isEmpty()) { 
- 			int i = s.pop(); 
- 			if (c[i] == WHITE) { 
- 				c[i] = GREY; 
- 				for (int j : outEdges(i)) 
- 					s.push(j); 
- 			} 
- 		} 
- 	} 
-   
- 	public static void-  main (String[]-  args ) {
 
- 		AdjMatrixGraph graph = new AdjMatrixGraph(10); 
-   
- 		graph.addEdge(1, 3); 
- 		graph.addEdge(2, 4); 
- 		graph.addEdge(6, 8); 
- 		graph.addEdge(3, 2); 
-   
- 		System- . out- . println("Edge from 6 to 8 is : " +-  graph. hasEdge(6- ,  8));
 
- 		System- . out- . println("Edge from 2 to 4 is : " +-  graph. hasEdge(2- ,  4));
 
- 		System- . out- . println("Edge from 3 to 2 is : " +-  graph. hasEdge(3- ,  2));
 
- 		System- . out- . println("Edge from 1 to 3 is : " +-  graph. hasEdge(1- ,  3));
 
-   
- 		graph.removeEdge(6, 8); 
- 		System- . out- . println("Edge from 6 to 8 is : " +-  graph. hasEdge(6- ,  8));
 
-   
- 	} 
- } 
				aW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLlF1ZXVlOwppbXBvcnQgamF2YS51dGlsLlN0YWNrOwoKLyoqCiAqIEltcGxlbWVudGF0aW9uIG9mIGEgZGlyZWN0ZWQgdW53ZWlnaHRlZCBHcmFwaCB1c2luZyBBZGphY2VuY3kgTWF0cml4CiAqIAogKiBDb21wbGV4aXR5OiBhZGRFZGdlLCByZW1vdmVFZGdlLCBoYXNFZGdlIE8oMSkgLyBvdXRFZGdlcywgaW5FZGdlcyBPKG4pIC8KICogU3BhY2UgTyhuXjIpCiAqLwpjbGFzcyBBZGpNYXRyaXhHcmFwaCB7CglpbnQgc2l6ZTsKCXByaXZhdGUgYm9vbGVhbltdW10gbWF0cml4OwoJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdISVRFID0gMTsKCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBHUkVZID0gMjsKCglwdWJsaWMgQWRqTWF0cml4R3JhcGgoaW50IHNpemUpIHsKCQl0aGlzLnNpemUgPSBzaXplOwoJCXRoaXMubWF0cml4ID0gbmV3IGJvb2xlYW5bc2l6ZV1bc2l6ZV07Cgl9CgoJcHVibGljIHZvaWQgYWRkRWRnZShpbnQgbm9kZUEsIGludCBub2RlQikgewoJCW1hdHJpeFtub2RlQV1bbm9kZUJdID0gdHJ1ZTsKCX0KCglwdWJsaWMgdm9pZCByZW1vdmVFZGdlKGludCBub2RlQSwgaW50IG5vZGVCKSB7CgkJbWF0cml4W25vZGVBXVtub2RlQl0gPSBmYWxzZTsKCX0KCglwdWJsaWMgYm9vbGVhbiBoYXNFZGdlKGludCBub2RlQSwgaW50IG5vZGVCKSB7CgkJcmV0dXJuIG1hdHJpeFtub2RlQV1bbm9kZUJdOwoJfQoKCXB1YmxpYyBMaXN0PEludGVnZXI+IG91dEVkZ2VzKGludCBpKSB7CgkJTGlzdDxJbnRlZ2VyPiBlZGdlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewoJCQlpZiAobWF0cml4W2ldW2pdKSB7CgkJCQllZGdlcy5hZGQoaik7CgkJCX0KCQl9CgkJcmV0dXJuIGVkZ2VzOwoJfQoKCXB1YmxpYyBMaXN0PEludGVnZXI+IGluRWRnZXMoaW50IGkpIHsKCQlMaXN0PEludGVnZXI+IGVkZ2VzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwoJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CgkJCWlmIChtYXRyaXhbal1baV0pIHsKCQkJCWVkZ2VzLmFkZChqKTsKCQkJfQoJCX0KCQlyZXR1cm4gZWRnZXM7Cgl9CgoJcHVibGljIGludCBuVmVydGljZXMoKSB7CgkJcmV0dXJuIHNpemU7Cgl9CgoJcHVibGljIHZvaWQgYnJlYWR0aEZpcnN0U2VhcmNoKGludCByb290KSB7CgkJYm9vbGVhbltdIHNlZW4gPSBuZXcgYm9vbGVhbltuVmVydGljZXMoKV07CgkJUXVldWU8SW50ZWdlcj4gcSA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CgkJcS5hZGQocm9vdCk7CgkJc2Vlbltyb290XSA9IHRydWU7CgkJd2hpbGUgKCFxLmlzRW1wdHkoKSkgewoJCQlpbnQgaSA9IHEucmVtb3ZlKCk7CgkJCWZvciAoSW50ZWdlciBqIDogb3V0RWRnZXMoaSkpIHsKCQkJCWlmICghc2VlbltqXSkgewoJCQkJCXEuYWRkKGopOwoJCQkJCXNlZW5bal0gPSB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXB1YmxpYyB2b2lkIGRlcHRoRmlyc3RTZWFyY2goaW50IHIpIHsKCQlieXRlW10gYyA9IG5ldyBieXRlW25WZXJ0aWNlcygpXTsKCQlTdGFjazxJbnRlZ2VyPiBzID0gbmV3IFN0YWNrPEludGVnZXI+KCk7CgkJcy5wdXNoKHIpOwoJCXdoaWxlICghcy5pc0VtcHR5KCkpIHsKCQkJaW50IGkgPSBzLnBvcCgpOwoJCQlpZiAoY1tpXSA9PSBXSElURSkgewoJCQkJY1tpXSA9IEdSRVk7CgkJCQlmb3IgKGludCBqIDogb3V0RWRnZXMoaSkpCgkJCQkJcy5wdXNoKGopOwoJCQl9CgkJfQoJfQoKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCQlBZGpNYXRyaXhHcmFwaCBncmFwaCA9IG5ldyBBZGpNYXRyaXhHcmFwaCgxMCk7CgoJCWdyYXBoLmFkZEVkZ2UoMSwgMyk7CgkJZ3JhcGguYWRkRWRnZSgyLCA0KTsKCQlncmFwaC5hZGRFZGdlKDYsIDgpOwoJCWdyYXBoLmFkZEVkZ2UoMywgMik7CgoJCVN5c3RlbS5vdXQucHJpbnRsbigiRWRnZSBmcm9tIDYgdG8gOCBpcyA6ICIgKyBncmFwaC5oYXNFZGdlKDYsIDgpKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVkZ2UgZnJvbSAyIHRvIDQgaXMgOiAiICsgZ3JhcGguaGFzRWRnZSgyLCA0KSk7CgkJU3lzdGVtLm91dC5wcmludGxuKCJFZGdlIGZyb20gMyB0byAyIGlzIDogIiArIGdyYXBoLmhhc0VkZ2UoMywgMikpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiRWRnZSBmcm9tIDEgdG8gMyBpcyA6ICIgKyBncmFwaC5oYXNFZGdlKDEsIDMpKTsKCgkJZ3JhcGgucmVtb3ZlRWRnZSg2LCA4KTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVkZ2UgZnJvbSA2IHRvIDggaXMgOiAiICsgZ3JhcGguaGFzRWRnZSg2LCA4KSk7CgoJfQp9