int DIGRAPHdfs( Digraph G, Vertex r) { Vertex v; conta = 0; for (v = 0; v < G->V; v++) lbl[v] = -1; dfsR( G, r); if (conta < G->V) return -1; return 0; }
void dfsR( Digraph G, Vertex v) { Vertex w; lbl[v] = conta++; for (w = 0; w < G->V; w++) if (G->adj[v][w] != 0) if (lbl[w] == -1) dfsR( G, w); }
void dfsR(Graph G, Edge e) { link t; int v, w = e.w; Edge x; if (e.v != e.w) printf("edge (%d, %d) is tree \n", e.v, e.w) ; st[e.w] = e.v; pre[w] = time++; for (t = G->adj[w]; t != NULL; t = t->next) if (pre[t->v] == -1) dfsR(G, EDGE(w, t->v)); else { v = t->v; x = EDGE(w, v); if (pre[w] < pre[v]) printf("edge (%d, %d) is back \n", x.v, x.w) ; } post[w] = time++; }
void GRAPHdfs(Graph G) { int v; time = 0; for (v=0; v < G->V; v++) { pre[v] = -1; post[v] = -1; st[v] = -1; } for (v=0; v < G->V; v++) if (pre[v]== -1) dfsR(G, EDGE(v,v)); printf("discovery/endprocessing time labels \n"); for (v=0; v < G->V; v++) printf("vertex %d : %d/%d \n", v, pre[v], post[v]); printf("resulting DFS tree \n"); for (v=0; v < G->V; v++) printf("parent of vertex %d is vertex %d \n", v, st[v]); }