Modificato alcune classi

This commit is contained in:
2014-06-01 20:32:07 +02:00
parent 71cea16bcb
commit 01c626d0e0
6 changed files with 36 additions and 54 deletions

View File

@@ -1,9 +1,5 @@
//gioel
package graph;
import exceptions.InvalidKeyException;
public class ComponentsBFS<V, E> extends BFS<V, E, Object, Integer> {
protected Integer compNumber;
protected Object COMPONENT = new Object();

View File

@@ -1,35 +1,21 @@
package graph;
//begin#fragment CC
import exceptions.InvalidKeyException;
/** This class extends DFS to compute the connected components of a graph. */
public class ComponentsDFS<V, E> extends DFS<V, E, Object, Integer> {
protected Integer compNumber; // Connected component number
protected Object COMPONENT = new Object(); // Connected comp. selector
protected void setup() { compNumber = 1; }
protected void startVisit(Vertex<V> v) {
try{
v.put(COMPONENT, compNumber);
}
catch (InvalidKeyException e){
//
}
}
protected Integer finalResult(Integer dfsResult) {
try{
for (Vertex<V> v : graph.vertices()) // check for any unvisited vertices
if (v.get(STATUS) == UNVISITED) {
compNumber += 1; // we have found another connected component
dfsTraversal(v); // visit all the vertices of this component
}
return compNumber;
}
catch (InvalidKeyException e){
//
}
return null;
}
}
//end#fragment CC

View File

@@ -38,34 +38,33 @@ public class DFS<V, E, I, R> {
if (!isDone())
startVisit(v);
if (!isDone()) {
visit(v);
for (Edge<E> e: graph.incidentEdges(v)) {
if (!isVisited(e)) {
// found an unexplored edge, explore it
visit(e);
Vertex<V> w = graph.opposite(v, e);
if (!isVisited(w)) {
// w is unexplored, this is a discovery edge
traverseDiscovery(e, v);
if (isDone()) break;
visitResult = dfsTraversal(w); // get result from DFS-tree child
if (isDone()) break;
}
else {
// w is explored, this is a back edge
traverseBack(e, v);
if (isDone()) break;
}
}
}
visit(v);
for (Edge<E> e: graph.incidentEdges(v)) {
if (!isVisited(e)) {
// found an unexplored edge, explore it
visit(e);
Vertex<V> w = graph.opposite(v, e);
if (!isVisited(w)) {
// w is unexplored, this is a discovery edge
traverseDiscovery(e, v);
if (isDone()) break;
visitResult = dfsTraversal(w); // get result from DFS-tree child
if (isDone()) break;
} else {
// w is explored, this is a back edge
traverseBack(e, v);
if (isDone()) break;
}
}
}
}
if(!isDone())
finishVisit(v);
return result();
}
//end#fragment DFS2
//begin#fragment decorations
/** Mark a position (vertex or edge) as visited. */
protected void visit(DecorablePosition<?> p) throws InvalidKeyException{
p.put(STATUS, VISITED);
@@ -100,7 +99,5 @@ public class DFS<V, E, I, R> {
protected R result() { return null; /* default value */ }
/** Returns the final result of the DFS execute method. */
protected R finalResult(R r) { return r; /* default value */ }
//end#fragment auxiliary
//begin#fragment Tail
} // end of DFS class
//end#fragment Tail
}

View File

@@ -1,5 +1,5 @@
package graph;
//begin#fragment FindCycleDFS
import position.NodePositionList;
import position.Position;
@@ -9,25 +9,26 @@ import position.PositionList;
//end#fragment FindCycleDFS
/* @author Roberto Tamassia, Michael Goodrich, Eric Zamore
*/
//begin#fragment FindCycleDFS
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;
//end#fragment FindCycleDFS
/**
* Executes the DFS algorithm.
* @return collection containing the vertices and
* edges of a cycle.
*/
//begin#fragment FindCycleDFS
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
@@ -35,6 +36,7 @@ public class FindCycleDFS<V, E>
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);
@@ -42,6 +44,7 @@ public class FindCycleDFS<V, E>
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()) {
@@ -54,5 +57,5 @@ public class FindCycleDFS<V, E>
return cycle; // list of the vertices and edges of the cycle
}
}
//end#fragment FindCycleDFS

View File

@@ -1,6 +1,5 @@
package graph;
//begin#fragment FindPathDFS
import position.NodePositionList;
import position.Position;
@@ -15,6 +14,7 @@ public class FindPathDFS<V, E>
extends DFS<V, E, Vertex<V>, Iterable<Position>> {
protected PositionList<Position> path;
protected boolean done;
/** Setup method to initialize the path. */
public void setup() {
path = new NodePositionList<Position>();
@@ -40,4 +40,4 @@ public class FindPathDFS<V, E>
return path;
}
}
//end#fragment FindPathDFS

Binary file not shown.