public static Digraph merge(Digraph destination, DigraphIteration graphToMerge) { for (Iterator i = graphToMerge.vertexIterator(); i.hasNext(); ) { destination.addVertex(i.next()); } for (ArcIterator i = graphToMerge.arcIterator(); i.hasNext(); ) { Object arc = i.next(); Object origin = i.getOrigin(); Object dst = i.getDestination(); destination.putArc(origin, dst, arc); } return destination; }
public static List findCycles(DigraphIteration graph) { ArrayStack stack = new ArrayStack(); ArrayStack path = new ArrayStack(); Set seen = new HashSet(); List cycles = new ArrayList(); Iterator vertexIterator = graph.vertexIterator(); while (vertexIterator.hasNext()) { while (vertexIterator.hasNext()) { Object vertex = vertexIterator.next(); if (seen.add(vertex)) { stack.push(graph.outgoingIterator(vertex)); path.push(vertex); break; } } while (!stack.isEmpty()) { ArcIterator i = (ArcIterator) stack.peek(); Object origin = i.getOrigin(); boolean subtreeIsTraversed = true; while (i.hasNext()) { i.next(); Object dst = i.getDestination(); int index = path.indexOf(dst); if (index < 0) { seen.add(dst); stack.push(graph.outgoingIterator(dst)); path.push(dst); subtreeIsTraversed = false; break; } else { cycles.add(new ArrayList(path.subList(index, path.size()))); } } if (subtreeIsTraversed) { stack.pop(); path.pop(); } } } return cycles; }
public static Digraph transform( Digraph result, DigraphIteration source, Transformer vertexTransform, Transformer arcTransform) { for (Iterator i = new TransformIterator(source.vertexIterator(), vertexTransform); i.hasNext(); ) { result.addVertex(i.next()); } for (ArcIterator i = new TransformArcIterator(source.arcIterator(), vertexTransform, arcTransform); i.hasNext(); ) { Object arc = i.next(); Object origin = i.getOrigin(); Object dst = i.getDestination(); result.putArc(origin, dst, arc); } return result; }