Example #1
0
        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);
        }
Example #2
0
        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());
                }
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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);
                    }
                }
            }
        }
Example #5
0
        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);
                    }
                }
            }
        }