/// <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); }
/// <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; } } }
/// <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); }