2

I have a while(whiteSet.size()>0) check in my code and inside the while block I call dfs method. The method modifies the HashSet. Why does the while loop never gives an error?

public class CycleInDG {
    Set<Vertex> whiteSet = new HashSet<>();
    Set<Vertex> greySet = new HashSet<>();
    Set<Vertex> blackSet = new HashSet<>();
    List<Integer> cyclePath = new ArrayList<>();
    Map<Vertex, Vertex> parentMap = new HashMap<>();
    Graph g = new Graph();

public boolean hasCycle() {
    Map<Integer, Vertex> map = g.getGraphMap();
    Collection<Vertex> vertices = map.values();
    for (Vertex vertex : vertices) {
        whiteSet.add(vertex);
    }
    while(whiteSet.size()>0) {
        parentMap.clear();
        if(dfs(whiteSet.iterator().next(), null)) {
            return true;
        }
    }
    return false;
}
public boolean dfs(Vertex current, Vertex parent) {
    moveVertex(current, whiteSet, greySet);
    for (Vertex vertex : current.getNeighbors()) {
        if(blackSet.contains(vertex)) {
            continue;
        }
        if(greySet.contains(vertex)) {
            parentMap.put(vertex, current);
            return true;
        }
        parentMap.put(vertex, current);
        boolean result = dfs(vertex, current);
        if(result) {
            return result;
        }
    }
    moveVertex(current, greySet, blackSet);
    return false;
}

public void moveVertex(Vertex v, Set<Vertex> src, Set<Vertex> dest) {
    src.remove(v);
    dest.add(v);
}
}
curiousengineer
  • 2,196
  • 5
  • 40
  • 59

0 Answers0