private Subgraph findSubgraph(Node node) { Subgraph subgraph = new Subgraph(graph); addReachable(node, subgraph); return subgraph; }
/** * Adds the argument node and all its out edges to the subgraph. * @param node the node to add * @param nodeStack the current set of nodes being traversed */ private void addEdges(Node node, Stack nodeStack, Subgraph subgraph) { node.setVisited(true); for (Iterator i = ((DirectedEdgeStar) node.getOutEdges()).iterator(); i.hasNext(); ) { DirectedEdge de = (DirectedEdge) i.next(); subgraph.add(de.getEdge()); Node toNode = de.getToNode(); if (! toNode.isVisited()) nodeStack.push(toNode); } }
/** * Tests whether a complete unique path exists in a graph * using Euler's Theorem. * * @param graph the subgraph containing the edges * @return <code>true</code> if a sequence exists */ private boolean hasSequence(Subgraph graph) { int oddDegreeCount = 0; for (Iterator i = graph.nodeIterator(); i.hasNext(); ) { Node node = (Node) i.next(); if (node.getDegree() % 2 == 1) oddDegreeCount++; } return oddDegreeCount <= 2; }
private List findSequence(Subgraph graph) { GraphComponent.setVisited(graph.edgeIterator(), false); Node startNode = findLowestDegreeNode(graph); DirectedEdge startDE = (DirectedEdge) startNode.getOutEdges().iterator().next(); DirectedEdge startDESym = startDE.getSym(); List seq = new LinkedList(); ListIterator lit = seq.listIterator(); addReverseSubpath(startDESym, lit, false); while (lit.hasPrevious()) { DirectedEdge prev = (DirectedEdge) lit.previous(); DirectedEdge unvisitedOutDE = findUnvisitedBestOrientedDE(prev.getFromNode()); if (unvisitedOutDE != null) addReverseSubpath(unvisitedOutDE.getSym(), lit, true); } /** * At this point, we have a valid sequence of graph DirectedEdges, but it * is not necessarily appropriately oriented relative to the underlying * geometry. */ List orientedSeq = orient(seq); return orientedSeq; }
private List findSequence(Subgraph graph) { GraphComponent.setVisited(graph.edgeIterator(), false); Node startNode = findLowestDegreeNode(graph); DirectedEdge startDE = (DirectedEdge) startNode.getOutEdges().iterator().next(); DirectedEdge startDESym = startDE.getSym(); List seq = new LinkedList(); ListIterator lit = seq.listIterator(); addReverseSubpath(startDESym, lit, false); while (lit.hasPrevious()) { DirectedEdge prev = (DirectedEdge) lit.previous(); DirectedEdge unvisitedOutDE = findUnvisitedBestOrientedDE(prev.getFromNode()); if (unvisitedOutDE != null) addReverseSubpath(unvisitedOutDE.getSym(), lit, true); } /** * At this point, we have a valid sequence of graph DirectedEdges, but it * is not necessarily appropriately oriented relative to the underlying * geometry. */ List orientedSeq = orient(seq); return orientedSeq; }
private static Node findLowestDegreeNode(Subgraph graph) { int minDegree = Integer.MAX_VALUE; Node minDegreeNode = null; for (Iterator i = graph.nodeIterator(); i.hasNext(); ) { Node node = (Node) i.next(); if (minDegreeNode == null || node.getDegree() < minDegree) { minDegree = node.getDegree(); minDegreeNode = node; } } return minDegreeNode; }
private Subgraph findSubgraph(Node node) { Subgraph subgraph = new Subgraph(graph); addReachable(node, subgraph); return subgraph; }
/** * Adds the argument node and all its out edges to the subgraph. * @param node the node to add * @param nodeStack the current set of nodes being traversed */ private void addEdges(Node node, Stack nodeStack, Subgraph subgraph) { node.setVisited(true); for (Iterator i = ((DirectedEdgeStar) node.getOutEdges()).iterator(); i.hasNext(); ) { DirectedEdge de = (DirectedEdge) i.next(); subgraph.add(de.getEdge()); Node toNode = de.getToNode(); if (! toNode.isVisited()) nodeStack.push(toNode); } }
/** * Tests whether a complete unique path exists in a graph * using Euler's Theorem. * * @param graph the subgraph containing the edges * @return <code>true</code> if a sequence exists */ private boolean hasSequence(Subgraph graph) { int oddDegreeCount = 0; for (Iterator i = graph.nodeIterator(); i.hasNext(); ) { Node node = (Node) i.next(); if (node.getDegree() % 2 == 1) oddDegreeCount++; } return oddDegreeCount <= 2; }
private static Node findLowestDegreeNode(Subgraph graph) { int minDegree = Integer.MAX_VALUE; Node minDegreeNode = null; for (Iterator i = graph.nodeIterator(); i.hasNext(); ) { Node node = (Node) i.next(); if (minDegreeNode == null || node.getDegree() < minDegree) { minDegree = node.getDegree(); minDegreeNode = node; } } return minDegreeNode; }