using System.Collections.Generic;
public static void Main()
int[][] edges = new int[5][];
edges[0] = new int[] { 1, 4 };
edges[1] = new int[] { 3 };
edges[2] = new int[] { 4 };
edges[3] = new int[] { 4 };
edges[4] = new int[] { 0 };
int[] pathWithLoop = FindLoop(edges);
Console.WriteLine("No loops found");
int loopVertex = pathWithLoop[pathWithLoop.Length - 1];
while(pathWithLoop[start] != loopVertex)
Console.Write("Loop found: {0}", loopVertex);
for(int i = start+1; i < pathWithLoop.Length; i++)
Console.Write(" -> {0}", pathWithLoop[i]);
private static int[] FindLoop(int [][] edges)
int[] edgesChecked = new int[V];
for(int vertexFrom = 0; vertexFrom < V; vertexFrom++)
if(edgesChecked[vertexFrom] < edges[vertexFrom].Length)
Stack<int> reachableFrom = new Stack<int>(V);
bool[] inStack = new bool[V];
reachableFrom.Push(vertexFrom);
inStack[vertexFrom] = true;
while(reachableFrom.Count > 0)
int vertex = reachableFrom.Peek();
if(edgesChecked[vertex] < edges[vertex].Length)
int nextVertex = edges[vertex][edgesChecked[vertex]];
reachableFrom.Push(nextVertex);
return reachableFrom.ToArray();
if(reachableFrom.Count > 0)
int previousVertex = reachableFrom.Peek();
edgesChecked[previousVertex]++;