We can use DFS to find a cycle in a given graph. The idea is that a cycle exists if we can find back edge in the graph. First I just want to detect if a cycle exists, if so return true else false. Here is what I have got so far:
DFS(G,s) for all v in V do color[v] <- white; parent[v] <- nil end for DFS-Visit(s) G is the given graph and s is the starting node.
DFS-Visit(u) color[u] <- gray for all v in Ajd[u] do if color[v] = gray then return true // found cycle if color[v] = white AND DFS-Visit(v) then return true // found cycle rooted in v end for color[u] <- black return false // no cycle found Ajd[u] is the list of u's neighbours. So by processing the children of u we might discover a node that is marked gray. If so u and v are connected with a back edge and we found a cycle.
Now I want to extend this algorithm to output the found cycle. Any ideas on how to do that? I thought about using a stack and simply push all u's in DFS-Visit onto the stack. When true is returned I can output the cycle by taking the nodes from the stack. What do you think?
Using a stack won't solve my problem, because the stack will contain nodes that are not part of the cycle.
I have another idea. When we found a cycle we know v=u. To print the cycle we have to go back using the parent list until we reach u:
DFS-Visit(u) color[u] <- gray foundCycle <- false vv <- nil for all v in Ajd[u] do if color[v] = gray then vv <- v foundCycle <- true // found cycle break if color[v] = white then parent[v] <- u DFS-Visit(v) end for color[u] <- black if foundCylce then printCycle(vv, u) printCycle(v,u) if v=u then print v else print v printCycle(parent[v], u)