package com.sample.app.model;
import java.util.List;
public class Vertex<T extends Comparable<T>> {
 private int id;
 private List<T> adjacentVertices;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public List<T> getAdjacentVertices() {
  return adjacentVertices;
 }
 public void setAdjacentVertices(List<T> adjacentVertices) {
  this.adjacentVertices = adjacentVertices;
 }
}
package com.sample.app.model;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class DirectedGraph<T extends Comparable<T>> {
 private Map<T, Set<T>> graph;
 private Map<T, Boolean> visited = new HashMap<>();
 private Set<T> distinctVertices = new HashSet<>();;
 public DirectedGraph() {
  graph = new HashMap<>();
 }
 public void addEdge(T from, T to) {
  Set<T> adjacencyList = graph.get(from);
  if (adjacencyList == null) {
   adjacencyList = new HashSet<T>();
  }
  adjacencyList.add(to);
  graph.put(from, adjacencyList);
  distinctVertices.add(from);
  distinctVertices.add(to);
 }
 public Map<T, Set<T>> getGraph() {
  return graph;
 }
 public void setGraph(Map<T, Set<T>> graph) {
  this.graph = graph;
 }
 public boolean isCycleExistDirectionalGraph() {
  Map<T, Boolean> visited = new HashMap<>();
  Map<T, Boolean> recStack = new HashMap<>();
  for (T key : distinctVertices) {
   visited.put(key, false);
   recStack.put(key, false);
  }
  for (T vertex : visited.keySet())
   if (isCyclicUtilDirectionalGraph(vertex, visited, recStack))
    return true;
  return false;
 }
 private boolean isCyclicUtilDirectionalGraph(T vertex, Map<T, Boolean> visited, Map<T, Boolean> recStack) {
  if (recStack.get(vertex))
   return true;
  if (visited.get(vertex))
   return false;
  visited.put(vertex, true);
  recStack.put(vertex, true);
  Set<T> children = graph.get(vertex);
  if (children != null)
   for (T c : children)
    if (isCyclicUtilDirectionalGraph(c, visited, recStack))
     return true;
  recStack.put(vertex, false);
  return false;
 }
}
package com.sample.app.model;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class DirectedGraphTest {
 @Test
 public void testCase1() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(1, 0);
  g1.addEdge(0, 2);
  g1.addEdge(2, 1);
  g1.addEdge(0, 3);
  g1.addEdge(3, 4);
  assertTrue(g1.isCycleExistDirectionalGraph());
 }
 @Test
 public void testCase2() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(0, 1);
  g1.addEdge(1, 2);
  assertFalse(g1.isCycleExistDirectionalGraph());
 }
 @Test
 public void testCase3() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  assertFalse(g1.isCycleExistDirectionalGraph());
 }
 @Test
 public void testCase4() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(123, 0);
  g1.addEdge(0, 123);
  g1.addEdge(4232, 123);
  g1.addEdge(0, 3);
  g1.addEdge(3, 4);
  assertTrue(g1.isCycleExistDirectionalGraph());
 }
 @Test
 public void testCase5() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(1, 1);
  assertTrue(g1.isCycleExistDirectionalGraph());
 }
 @Test
 public void testCase6() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(1, 2);
  g1.addEdge(1, 1);
  assertTrue(g1.isCycleExistDirectionalGraph());
 }
 @Test
 public void testCase7() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(1, 2);
  g1.addEdge(1, 3);
  g1.addEdge(2, 3);
  assertFalse(g1.isCycleExistDirectionalGraph());
 }
 @Test
 public void testCase8() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(1, 2);
  g1.addEdge(1, 3);
  g1.addEdge(2, 3);
  g1.addEdge(3, 1);
  assertTrue(g1.isCycleExistDirectionalGraph());
 }
 @Test
 public void testCase9() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(1, 2);
  g1.addEdge(1, 3);
  g1.addEdge(2, 3);
  g1.addEdge(3, 4);
  g1.addEdge(3, 5);
  g1.addEdge(5, 2);
  assertTrue(g1.isCycleExistDirectionalGraph());
 }
 
 @Test
 public void testCase10() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(191, 232);
  g1.addEdge(340, 466);
  assertFalse(g1.isCycleExistDirectionalGraph());
 }
 
 @Test
 public void testCase11() {
  DirectedGraph g1 = new DirectedGraph<Integer>();
  g1.addEdge(191, 232);
  g1.addEdge(340, 466);
  g1.addEdge(466, 340);
  assertTrue(g1.isCycleExistDirectionalGraph());
 }
}
 
 
No comments:
Post a Comment