#include /* Depth-first search on directed graph, p. 478 in CLR */ #define VERTEXMAX 40 #define EDGEMAX VERTEXMAX*VERTEXMAX enum vertexStatusEnum {WHITE,GRAY,BLACK}; enum edgeEnum {TREE,CROSS,BACK,FORWARD}; int numVertices,numEdges; enum vertexStatusEnum vertexStatus[VERTEXMAX]; int dfsNumber[VERTEXMAX],maxDescendant[VERTEXMAX]; int firstEdge[VERTEXMAX]; /*Points to first edge for vertex as tail*/ /*These 3 arrays are used together for adjacency list nodes*/ int head[EDGEMAX]; enum edgeEnum edgeType[EDGEMAX]; int nextNode[EDGEMAX]; int nextDFS; /*Keeps node numbering*/ int DFSvisit(u) int u; { int descendant,v,i; vertexStatus[u]=GRAY; descendant=maxDescendant[u]=dfsNumber[u]=(++nextDFS); for (i=firstEdge[u];i!=(-1);i=nextNode[i]) { v=head[i]; if (vertexStatus[v]==WHITE) { edgeType[i]=TREE; descendant=maxDescendant[u]=DFSvisit(v); } else if (vertexStatus[v]==GRAY) edgeType[i]=BACK; else if (dfsNumber[u]