Ejemplo n.º 1
0
        /// <summary>
        /// Пытается получить информацию по указанной вершине из коллекции <see cref="_verticesInfo"/>.
        /// Если по какой-либо причине информация не найдена, то возвращает false,
        /// а <paramref name="dijkstraVertexInfo"/> устанавливается в стандартное значение.
        /// </summary>
        /// <param name="vertex">Вершина, соответствующий объект DijkstraVertexInfo которой необходимо получить.</param>
        /// <param name="dijkstraVertexInfo">Возвращаемая информация по вершине.</param>
        /// <returns>true, если информация найдена.</returns>
        private bool TryGetVertexInfo(Vertex vertex, out DijkstraVertexInfo dijkstraVertexInfo)
        {
            dijkstraVertexInfo = default(DijkstraVertexInfo);

            if (_verticesInfo.Contains(vertex))
            {
                dijkstraVertexInfo = _verticesInfo[vertex];
                return(true);
            }
            return(false);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Вычисляет сумму весов ребер для всех вершин, которые связаны с указанной.
 /// </summary>
 /// <param name="info">Информация о текущей вершине.</param>
 private void SetSumToNextVertex(DijkstraVertexInfo info)
 {
     info.IsVisited = true;
     foreach (var e in info.Vertex.Edges)
     {
         TryGetVertexInfo(e.ConnectedVertex, out var nextInfo);
         var sum = info.TotalEdgesWeight + e.EdgeWeight;
         if (sum < nextInfo.TotalEdgesWeight)
         {
             nextInfo.TotalEdgesWeight = sum;
             nextInfo.PathEdgesWeight  = e.EdgeWeight;
             nextInfo.PreviousVertex   = info.Vertex;
         }
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Осуществляет поиск непосещенной вершины с минимальной суммой весов ребер, а также
        /// возвращает её, если такая вершина найдена.
        /// </summary>
        /// <returns>Объект с информацией о вершине. null, если вершина не найдена.</returns>
        private DijkstraVertexInfo FindUnvisitedVertexWithMinSum()
        {
            var minValue = float.MaxValue;
            DijkstraVertexInfo minVertexInfo = null;

            foreach (DijkstraVertexInfo vertexInfo in _verticesInfo)
            {
                if (!vertexInfo.IsVisited && vertexInfo.TotalEdgesWeight < minValue)
                {
                    minVertexInfo = vertexInfo;
                    minValue      = vertexInfo.TotalEdgesWeight;
                }
            }

            return(minVertexInfo);
        }