Ejemplo n.º 1
0
        public bool TryGetOutEdges(VertexId vertex, out IEnumerable <Edge> edges)
        {
            var vertexOutEdges = outEdges[vertex];

            edges = vertexOutEdges;
            return(vertexOutEdges.Count != 0);
        }
Ejemplo n.º 2
0
        public bool ContainsEdge(VertexId start, VertexId end)
        {
            var edges = outEdges[start];

            for (int i = 0; i < edges.Count; ++i)
            {
                Edge currentEdge = edges[i];
                if (currentEdge.EndVertex == end)
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 3
0
        private List <VertexId> TopologicalSort(Graph graph)
        {
            var vertices  = new List <VertexId>();
            var inDegrees = new Dictionary <VertexId, int>();
            var queue     = new Queue <VertexId>();

            foreach (VertexId vertex in graph.Vertices)
            {
                int inEdgeCount = 0;
                if (graph.TryGetInEdges(vertex, out IEnumerable <Edge> edges))
                {
                    inEdgeCount = edges.Count();
                }

                inDegrees.Add(vertex, inEdgeCount);

                if (inEdgeCount == 0)
                {
                    queue.Enqueue(vertex);
                }
            }

            while (queue.Count != 0)
            {
                VertexId vertex = queue.Dequeue();
                vertices.Add(vertex);

                if (graph.TryGetOutEdges(vertex, out IEnumerable <Edge> edges))
                {
                    foreach (Edge edge in edges)
                    {
                        int inDegree = inDegrees[edge.EndVertex];
                        if (inDegree > 0)
                        {
                            int newInDegree = inDegree - 1;
                            inDegrees[edge.EndVertex] = newInDegree;

                            if (newInDegree == 0)
                            {
                                queue.Enqueue(edge.EndVertex);
                            }
                        }
                    }
                }
            }

            return(vertices);
        }
Ejemplo n.º 4
0
        public bool TryGetEdge(VertexId start, VertexId end, out Edge edge)
        {
            var edges = outEdges[start];

            for (int i = 0; i < edges.Count; ++i)
            {
                Edge currentEdge = edges[i];
                if (currentEdge.EndVertex == end)
                {
                    edge = currentEdge;
                    return(true);
                }
            }

            edge = default;
            return(false);
        }
Ejemplo n.º 5
0
 public void AddVertex(VertexId vertexId)
 {
     inEdges.Add(vertexId, new List <Edge>());
     outEdges.Add(vertexId, new List <Edge>());
 }
Ejemplo n.º 6
0
        public bool Find(Graph graph, VertexId start, VertexId end, out List <VertexId> vertices, out int distance)
        {
            List <VertexId> sortedVertices = TopologicalSort(graph);

            var lengthTo = new Dictionary <VertexId, int>();

            foreach (VertexId vertex in graph.Vertices)
            {
                lengthTo.Add(vertex, int.MinValue);
            }

            lengthTo[start] = 0;

            var comeFrom = new Dictionary <VertexId, VertexId>();

            for (int i = 0; i < sortedVertices.Count; ++i)
            {
                VertexId vertex         = sortedVertices[i];
                int      lengthToVertex = lengthTo[vertex];

                if (lengthToVertex != int.MinValue && graph.TryGetOutEdges(vertex, out IEnumerable <Edge> edges))
                {
                    foreach (Edge edge in edges)
                    {
                        int lengthWithWeight = lengthToVertex + edge.Weight;
                        if (lengthTo[edge.EndVertex] <= lengthWithWeight)
                        {
                            lengthTo[edge.EndVertex] = lengthWithWeight;
                            comeFrom[edge.EndVertex] = edge.StartVertex;
                        }
                    }
                }
            }

            vertices = new List <VertexId>();

            var queue = new Queue <VertexId>();

            queue.Enqueue(end);

            while (queue.Count != 0)
            {
                VertexId currentVertex = queue.Dequeue();
                vertices.Add(currentVertex);

                if (currentVertex != start && comeFrom.TryGetValue(currentVertex, out VertexId fromVertex))
                {
                    queue.Enqueue(fromVertex);
                }
            }

            vertices.Reverse();

            if (vertices.Count == 0 || vertices[0] != start)
            {
                distance = 0;
                return(false);
            }

            distance = lengthTo[end];

            return(true);
        }
Ejemplo n.º 7
0
 public bool ContainsVertex(VertexId vertex)
 {
     return(outEdges.ContainsKey(vertex));
 }