public DFSReverseTopologicalSort(DigraphIteration factory, Object firstVertex) { dfs = new DepthFirstStampSearch(factory, firstVertex); }
public boolean hasNext() { return dfs.hasNext(); }
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; }
public Map traverse(Map orders) { int preOrder = 0; int postOrder = 0; while (hasNext()) { Object vertex = next(); int stamp = getStamp(); if (stamp == SHRINK_STAMP) { postOrder++; OrderPair pair = (OrderPair)orders.get(vertex); if (pair == null) { preOrder++; orders.put(vertex, new OrderPair(preOrder, postOrder)); } else pair.postOrder = postOrder; } else if (stamp == LEAF_STAMP) { preOrder++; postOrder++; orders.put(vertex, new OrderPair(preOrder, postOrder)); } else if (!orders.containsKey(vertex)) { preOrder++; orders.put(vertex, new OrderPair(preOrder, -1)); } } return orders; }
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; }
public void reset(Object newFirstVertex) { dfs.reset(newFirstVertex); }
DepthFirstStampSearch sizeTraversal = new DepthFirstStampSearch(digraph, root); while (sizeTraversal.hasNext()) { Object vertex = sizeTraversal.next(); int stamp = sizeTraversal.getStamp(); if (stamp == DepthFirstStampSearch.LEAF_STAMP) { RectangularShape leafShape = (RectangularShape)vertexShape.get(vertex); DepthFirstStampSearch vertexLocationTraversal = new DepthFirstStampSearch(digraph, root); while (vertexLocationTraversal.hasNext()) { Object vertex = vertexLocationTraversal.next(); int stamp = vertexLocationTraversal.getStamp(); if (stamp == DepthFirstStampSearch.LEAF_STAMP) { RectangularShape leafShape = (RectangularShape)vertexShape.get(vertex);