62 lines
1.7 KiB
Java
62 lines
1.7 KiB
Java
package graph;
|
|
|
|
|
|
import position.NodePositionList;
|
|
import position.Position;
|
|
import position.PositionList;
|
|
|
|
/** This class specializes DFS to find a cycle. */
|
|
//end#fragment FindCycleDFS
|
|
/* @author Roberto Tamassia, Michael Goodrich, Eric Zamore
|
|
*/
|
|
|
|
public class FindCycleDFS<V, E>
|
|
extends DFS<V, E, Object, Iterable<Position>> {
|
|
protected PositionList<Position> cycle; // sequence of edges of the cycle
|
|
protected boolean done;
|
|
protected Vertex<V> cycleStart;
|
|
|
|
|
|
/**
|
|
* Executes the DFS algorithm.
|
|
* @return collection containing the vertices and
|
|
* edges of a cycle.
|
|
*/
|
|
|
|
public void setup() {
|
|
cycle = new NodePositionList<Position>();
|
|
done = false;
|
|
}
|
|
protected void startVisit(Vertex<V> v) { cycle.addLast(v); }
|
|
|
|
protected void finishVisit(Vertex<V> v) {
|
|
cycle.remove(cycle.last()); // remove v from cycle
|
|
if (!cycle.isEmpty()) cycle.remove(cycle.last()); // remove edge into v from cycle
|
|
}
|
|
protected void traverseDiscovery(Edge<E> e, Vertex<V> from) {
|
|
cycle.addLast(e);
|
|
}
|
|
|
|
protected void traverseBack(Edge<E> e, Vertex<V> from) {
|
|
cycle.addLast(e); // back edge e creates a cycle
|
|
cycleStart = graph.opposite(from, e);
|
|
cycle.addLast(cycleStart); // first vertex completes the cycle
|
|
done = true;
|
|
}
|
|
protected boolean isDone() { return done; }
|
|
|
|
public Iterable<Position> finalResult(Iterable<Position> r) {
|
|
// remove the vertices and edges from start to cycleStart
|
|
if (!cycle.isEmpty()) {
|
|
for (Position<Position> p: cycle.positions()) {
|
|
if (p.element() == cycleStart)
|
|
break;
|
|
cycle.remove(p); // remove vertex from cycle
|
|
}
|
|
}
|
|
return cycle; // list of the vertices and edges of the cycle
|
|
}
|
|
}
|
|
|
|
|