package GPL;
import java.lang.Integer;
// *************************************************************************
public class CycleWorkSpace extends WorkSpace {
public boolean AnyCycles;
public int counter;
public boolean isDirected;
public static final int WHITE = 0;
public static final int GRAY = 1;
public static final int BLACK = 2;
public CycleWorkSpace( boolean UnDir ) {
AnyCycles = false;
counter = 0;
isDirected = UnDir;
}
public void init_vertex( Vertex v )
{
v.VertexCycle = Integer.MAX_VALUE;
v.VertexColor = WHITE; // initialize to white color
}
public void preVisitAction( Vertex v ) {
// This assigns the values on the way in
if ( v.visited!=true )
{ // if it has not been visited then set the
// VertexCycle accordingly
v.VertexCycle = counter++;
v.VertexColor = GRAY; // we make the vertex gray
}
}
public void postVisitAction( Vertex v )
{
v.VertexColor = BLACK; // we are done visiting so make it black
counter--;
} // of postVisitAction
public void checkNeighborAction( Vertex vsource,
Vertex vtarget )
{
// if the graph is directed is enough to check that the source node
// is gray and the adyacent is gray also to find a cycle
// if the graph is undirected we need to check that the adyacent is not
// the father, if it is the father the difference in the VertexCount is
// only one.
if ( isDirected )
{
if ( ( vsource.VertexColor == GRAY ) && ( vtarget.VertexColor == GRAY ) )
{
AnyCycles = true;
}
}
else
{ // undirected case
if ( ( vsource.VertexColor == GRAY ) && ( vtarget.VertexColor == GRAY )
&& vsource.VertexCycle != vtarget.VertexCycle+1 )
{
AnyCycles = true;
}
}
} // of checkNeighboor
}