/** * Checks for any coincident ends of edges. * * @return a List of the coincident edges, if any */ public Set checkCoincidentEdges() { Set coincidentEdges = new HashSet(); for (Iterator i = nodeIterator(); i.hasNext(); ) { Node node = (Node) i.next(); DirectedEdgeStar deStar = node.getOutEdges(); DirectedEdge firstDE = null; DirectedEdge prevDE = null; for (Iterator j = deStar.iterator(); j.hasNext(); ) { DirectedEdge de = (DirectedEdge) j.next(); if (firstDE == null) firstDE = de; if (prevDE != null) { if (isCoincidentEdge(de, prevDE)) { coincidentEdges.add(de.getEdge()); coincidentEdges.add(prevDE.getEdge()); } } prevDE = de; } if (firstDE != prevDE) if (isCoincidentEdge(firstDE, prevDE)) { coincidentEdges.add(firstDE.getEdge()); coincidentEdges.add(prevDE.getEdge()); } } return coincidentEdges; }
public void traverseBFS(Node<N, E> startingNode, BFSTraversalVisitor tv, boolean longestPath) { if (longestPath) { markReachable(startingNode); } for (Node<N, E> n : getNodes()) { n.setVisited(false); n.setActive(false); } Queue<Node<N, E>> queue = new LinkedList<Node<N, E>>(); queue.add(startingNode); startingNode.setVisited(true); int layer = 0; Node<N, E> lastOfLayer = startingNode; Node<N, E> lastAdded = null; while (!queue.isEmpty()) { Node<N, E> current = queue.poll(); tv.visitNode(current, layer); current.setActive(false); for (Edge<N, E> e : current.getOutEdges()) { if (!e.getDest().isVisited()) { boolean allow = true; if (longestPath) { for (Node<N, E> pred : e.getDest().getPredecessors()) { if ((!pred.isVisited() || pred.isActive()) && pred.isReachable()) { allow = false; break; } } } if (allow) { queue.offer(e.getDest()); lastAdded = e.getDest(); e.getDest().setVisited(true); e.getDest().setActive(true); } } } if (current == lastOfLayer && !queue.isEmpty()) { lastOfLayer = lastAdded; layer++; } } }
private void traverse(DFSTraversalVisitor tv, Node<N, E> n) { if (!n.isVisited()) { n.setVisited(true); n.setActive(true); tv.visitNode(n); for (Edge<N, E> e : n.getOutEdges()) { Node<N, E> next = e.getDest(); if (next.isActive()) { tv.visitEdge(e, true); } else { if (tv.visitEdge(e, false)) { traverse(tv, next); } } } n.setActive(false); } }