public void reset(Object newFirstVertex) { dfs.reset(newFirstVertex); }
public static boolean isAcyclic(Digraph digraph) { int order = digraph.order(); if (order == 0) return true; Set spanned = new HashSet(order); DepthFirstStampSearch dfs = new DepthFirstStampSearch(digraph, digraph.vertexIterator().next()); for (Iterator i = digraph.vertexIterator(); i.hasNext();) { Object dfsRoot = i.next(); if (spanned.contains(dfsRoot)) continue; dfs.reset(dfsRoot); Map dfsOrders = dfs.traverse(new HashMap(digraph.order())); for (Iterator j = dfsOrders.entrySet().iterator(); j.hasNext();) { Map.Entry entry = (Map.Entry)j.next(); Object origin = entry.getKey(); DepthFirstStampSearch.OrderPair orgOrders = (DepthFirstStampSearch.OrderPair)entry.getValue(); spanned.add(origin); for (ArcIterator k = digraph.outgoingIterator(origin); k.hasNext();) { k.next(); Object dst = k.getDestination(); DepthFirstStampSearch.OrderPair dstOrders = (DepthFirstStampSearch.OrderPair)dfsOrders.get(dst); if (dstOrders.getPostOrder() > orgOrders.getPostOrder()) return false; } } if (dfsOrders.size() == order) break; } return true; }
private boolean runDirectDFS() { dfsStack.clear(); reverseDFSFilter.seenVertices.clear(); Object root = nextDFSRoot(); if (root == null) return false; if (directDfs == null) directDfs = new DepthFirstStampSearch(filteredDigraph, root); else directDfs.reset(root); int stamp; Object vertex; while (directDfs.hasNext()) { vertex = directDfs.next(); stamp = directDfs.getStamp(); if (stamp == DepthFirstStampSearch.SHRINK_STAMP || stamp == DepthFirstStampSearch.LEAF_STAMP) { //if (seen.add(vertex)) { dfsStack.push(vertex); reverseDFSFilter.seenVertices.add(vertex); //} } } seen.addAll(dfsStack); return true; }