#include /* Depth-first search on directed graph, p. 541 in CLRS */ #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 discovery[VERTEXMAX],finish[VERTEXMAX],predecessor[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 time; /*Keeps node numbering*/ int DFSvisit(u) int u; { int i,v; vertexStatus[u]=GRAY; time++; discovery[u]=time; for (i=firstEdge[u];i!=(-1);i=nextNode[i]) { v=head[i]; if (vertexStatus[v]==WHITE) { edgeType[i]=TREE; predecessor[v]=u; DFSvisit(v); } else if (vertexStatus[v]==GRAY) edgeType[i]=BACK; else if (discovery[u]