void dfs(graph *g, int v) { edgenode *p; int y;
if (finished) return;
discovered[v] = true; dfstime = dfstime + 1; entry_time[v] = dfstime;
process_vertex_early(v); p = g->edges[v]; while(p != NULL) { y = p->y; if (discovered[y] == false) { parent[y] = v; // process_edge(v, y); dfs(g, y); } else if (!processed[y] || (g->directed)) process_edge(v, y);
if (finished) return;
p = p->next; } process_vertex_late(v); dfstime = dfstime + 1; exit_time[v] = dfstime; processed[v] = true; } void process_edge(int x, int y) { if (parent[x] != y) { printf("Cycle from %d to %d:", y, x); find_path(y, x, parent); printf("\n\n"); finished = true; } printf("processed edge (%d %d)\n", x, y);
} void find_path(int start, int end, int parents[]) { if ((start == end) || (end == -1)) printf("\n%d", start); else { find_path(start, parents[end], parents); printf(" %d", end); }
} int main(int argc, const char * argv[]) { graph *myGraph = (graph *)malloc(sizeof(graph)); load_graphC(myGraph, false); finished = false; initialize_search(myGraph); dfs(myGraph, 1); return 0;
} |
Algorithms > Graph >