- private static boolean findcycles(Set cycles, Set acyclic, Stack visited, GraphNode gn, Collection nodes) {
- if (visited.contains(gn)) {/* Found cycle */
- cycles.addAll(visited.subList(visited.indexOf(gn),visited.size())); /* Add this cycle */
- return true;
- }
- boolean acyclicflag=true;
- visited.push(gn);
- for(Iterator it=gn.edges();it.hasNext();) {
- Edge e=(Edge) it.next();
- GraphNode node = e.getTarget();
- if (!nodes.contains(node))
- continue; /* Don't visit stuff outside set */
- if (acyclic.contains(node))
- continue;
- if (findcycles(cycles,acyclic,visited,node,nodes)) {
- /* Found cycle */
- acyclicflag=false;
- }
- }
- visited.pop();
- if (acyclicflag) {
- acyclic.add(gn); /* no cycles through gn */
- return false;
- } else
- return true; /* found cycle */
- }
-