/// <summary> /// Преобразовывает объект города в граф, где /// вершины - точки пересечений дорог; /// ребра - дороги. /// </summary> /// <param name="city">Объект с городом.</param> /// <returns>Граф, соответствующий указанному объекту с городом.</returns> public static Graph ConvertCityToGraph(City.City city) { Dictionary <Institution, Vertex> processingInstitutions = new Dictionary <Institution, Vertex>(); Dictionary <Institution, Vertex> processedInstitutions = new Dictionary <Institution, Vertex>(); Graph graph = new Graph(); foreach (var institution in city.Institutions) { AddVertex(graph, null, institution, processingInstitutions, processedInstitutions); } return(graph); }
/// <summary> /// Осуществляет поиск кратчайшего пути до необходимого типа постройки в «городе». /// Если построек такого типа несколько, то возвращает путь только до той, который оказался самым кратчайшим. /// Если не удалось найти, то возвращает пустой путь. /// </summary> /// <param name="city">Объект с городом, поиск пути в котором необходимого выполнить.</param> /// <param name="startInstitution">Стартовый объект, из которой ищем путь.</param> /// <param name="institutionType">Тип постройки, к которой ищем путь.</param> /// <returns>Объект с информацией о найденном или не найденном пути.</returns> public static CityPathInfo FindPathTo(City.City city, Institution startInstitution, InstitutionType institutionType) { Graph graph = ConvertCityToGraph(city); Vertex startVertex = graph.Vertices.FirstOrDefault(vertex => vertex.Tag == startInstitution); if (startVertex == null) { throw new ArgumentException("'startInstitution' is not found in the 'city' object", nameof(startInstitution)); } PathInfo pathInfo = FindPathTo(graph, startVertex, institutionType); CityPathInfo cityPathInfo = new CityPathInfo( pathInfo.Path.Select(vertex => vertex.Tag as Institution).ToArray(), pathInfo.TotalLength); return(cityPathInfo); }