/// <summary> /// Конструктор /// </summary> /// <param name="vertex">Вершина</param> public GraphVertexInfo(GraphVertex vertex) { Vertex = vertex; IsUnvisited = true; EdgesWeightSum = int.MaxValue; PreviousVertex = null; }
/// <summary> /// Получение информации о вершине графа /// </summary> /// <param name="v">Вершина</param> /// <returns>Информация о вершине</returns> GraphVertexInfo GetVertexInfo(GraphVertex v) { foreach (var i in infos) { if (i.Vertex.Equals(v)) { return(i); } } return(null); }
/// <summary> /// Формирование пути /// </summary> /// <param name="startVertex">Начальная вершина</param> /// <param name="endVertex">Конечная вершина</param> /// <returns>Путь</returns> List <ElementId> GetPath(GraphVertex startVertex, GraphVertex endVertex) { List <ElementId> elementIds = new List <ElementId>(); var path = endVertex.ToString(); elementIds.Add(new ElementId(Convert.ToInt32(path))); while (startVertex != endVertex) { endVertex = GetVertexInfo(endVertex).PreviousVertex; elementIds.Add(new ElementId(Convert.ToInt32(endVertex.ToString()))); } return(elementIds); }
/// <summary> /// Поиск кратчайшего пути по вершинам /// </summary> /// <param name="startVertex">Стартовая вершина</param> /// <param name="finishVertex">Финишная вершина</param> /// <returns>Кратчайший путь</returns> public List <ElementId> FindShortestPath(GraphVertex startVertex, GraphVertex finishVertex) { InitInfo(); var first = GetVertexInfo(startVertex); first.EdgesWeightSum = 0; while (true) { var current = FindUnvisitedVertexWithMinSum(); if (current == null) { break; } SetSumToNextVertex(current); } return(GetPath(startVertex, finishVertex)); }
/// <summary> /// Добавить ребро /// </summary> /// <param name="vertex">Вершина</param> /// <param name="edgeWeight">Вес</param> public void AddEdge(GraphVertex vertex, double edgeWeight) { AddEdge(new GraphEdge(vertex, edgeWeight)); }
/// <summary> /// Конструктор /// </summary> /// <param name="connectedVertex">Связанная вершина</param> /// <param name="weight">Вес ребра</param> public GraphEdge(GraphVertex connectedVertex, double weight) { ConnectedVertex = connectedVertex; EdgeWeight = weight; }