public static int ComputeShortestPath(IDirectedGraph <int> graph, int startVertex, int endVertex) { if (startVertex == endVertex) { return(0); } // Key - Node, Value - node distance from startVertex var exploredVertices = new Dictionary <int, int> { { startVertex, 0 } }; var queue = new Queue <int>(); queue.Enqueue(startVertex); while (queue.Any()) { int v = queue.Dequeue(); foreach (int w in graph.GetAdjacentVertices(v)) { if (!exploredVertices.ContainsKey(w)) { int dist = exploredVertices[v] + 1; exploredVertices.Add(w, dist); queue.Enqueue(w); } } } return(exploredVertices.ContainsKey(endVertex) ? exploredVertices[endVertex] : int.MinValue); }
private static void DfsFindSccs(IDirectedGraph <int> graph, int startVertex, HashSet <int> exploredVertices, List <int> sccs) { var stack = new Stack <int>(); stack.Push(startVertex); while (stack.Any()) { int v = stack.Peek(); if (!exploredVertices.Contains(v)) { exploredVertices.Add(v); } bool hasUnexploredNeighbours = false; foreach (int w in graph.GetAdjacentVertices(v)) { if (!exploredVertices.Contains(w)) { hasUnexploredNeighbours = true; stack.Push(w); break; } } if (!hasUnexploredNeighbours) { sccs.Add(stack.Pop()); } } }
public static IDirectedGraph <int> ReverseGraph(IDirectedGraph <int> graph) { var reversedGraph = new DirectedGraphAdjList <int>(saveReversedVersion: false, vertices: graph.GetVertices().ToArray()); foreach (int v in graph.GetVertices()) { foreach (int w in graph.GetAdjacentVertices(v)) { reversedGraph.AddEdge(w, v); } } return(reversedGraph); }
public static IEnumerable <int> BreadthFirst(IDirectedGraph <int> graph, int startVertex) { var exploredVertices = new HashSet <int> { startVertex }; var queue = new Queue <int>(); queue.Enqueue(startVertex); while (queue.Any()) { int v = queue.Dequeue(); yield return(v); foreach (int w in graph.GetAdjacentVertices(v)) { if (!exploredVertices.Contains(w)) { exploredVertices.Add(w); queue.Enqueue(w); } } } }
public static IEnumerable <int> DepthFirst(IDirectedGraph <int> graph, int startVertex) { var exploredVertices = new HashSet <int> { startVertex }; var stack = new Stack <int>(); stack.Push(startVertex); while (stack.Any()) { int v = stack.Pop(); yield return(v); foreach (int w in graph.GetAdjacentVertices(v)) { if (!exploredVertices.Contains(w)) { exploredVertices.Add(w); stack.Push(w); } } } }