public static int[][] Invert(int [][] edges)
int [] leftToSet = new int[V];
for(int vertexFrom = 0; vertexFrom < V; vertexFrom++)
foreach(int vertexTo in edges[vertexFrom])
int [][] inv = new int[V][];
for(int vertexTo = 0; vertexTo < V; vertexTo++)
inv[vertexTo] = new int[leftToSet[vertexTo]];
for(int vertexFrom = 0; vertexFrom < V; vertexFrom++)
foreach(int vertexTo in edges[vertexFrom])
inv[vertexTo][leftToSet[vertexTo]] = vertexFrom;
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 [][] inv = Invert(edges);
Print("Original graph", edges);
Print("Inverted graph", inv);
private static void Print(string title, int [][] edges)
Console.WriteLine(title);
for(int vertexFrom = 0; vertexFrom < edges.Length; vertexFrom++)
Console.Write("{0} ->", vertexFrom);
foreach(int vertexTo in edges[vertexFrom])
Console.Write(" {0}", vertexTo);