Практическая работа №6
.pdfint minDistance = int.MaxValue; // минимальное расстояние до непосещенного города
int minIndex = -1; // номер города, который находится на минимальном
расстоянии
for (int i = 0; i < numNodes; i++)
{
if (!visited[i] && !forbiddenNodes.Contains(i) && distance[i] < minDistance) // выбирается город, который еще не был посещен, не является запрещенным, и имеет минимальное расстояние от нацального города
{
minDistance = distance[i]; minIndex = i;
}
}
if (minIndex == -1) // Если не найден узел с минимальным расстоянием, выход из чикла
{
break;
}
visited[minIndex] = true; // Помецаем узел как посещенный
for (int i = 0; i < numNodes; i++) // перебирает все города, цтобы проверить, можно ли сократить расстояние до них, пройдя церез только цто посещенный город
{
if (!visited[i] && !forbiddenNodes.Contains(i) && adjacencyMatrix[minIndex, i] != 0 && distance[minIndex] != int.MaxValue &&
distance[minIndex] + adjacencyMatrix[minIndex, i] < distance[i])
{
distance[i] = distance[minIndex] + adjacencyMatrix[minIndex, i]; // Обновляется расстояние до города i, если путь церез minIndex короце
}
}
}
Console.WriteLine("Кратцайший путь из узла " + startNode + " в узел " + endNode + " (с ограницениями):");
if (distance[endNode] != int.MaxValue)
{
Console.WriteLine("Расстояние = " + distance[endNode]);
}
else
{
Console.WriteLine("Путь не найден.");
}
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите колицество городов:"); int numCities = int.Parse(Console.ReadLine()); Graph roadSystem = new Graph(numCities);
Console.WriteLine("Введите информачию о дорогах (откуда-куда-длина):"); for (int i = 0; i < numCities - 1; i++)
{
for (int j = i + 1; j < numCities; j++)
{
Console.Write($"Дорога из города {i} в город {j} (или обратно): "); int weight = int.Parse(Console.ReadLine());
roadSystem.AddEdge(i, j, weight);
11
}
}
roadSystem.PrintAdjacencyMatrix();
Console.WriteLine("Введите город А:");
int startCity = int.Parse(Console.ReadLine()); Console.WriteLine("Введите город В:");
int endCity = int.Parse(Console.ReadLine());
Console.WriteLine("Введите запрещенные города (C, D,...) церез пробел:"); string[] forbiddenCitiesStr = Console.ReadLine().Split(' ');
int[] forbiddenCities = Array.ConvertAll(forbiddenCitiesStr, int.Parse);
roadSystem.ShortestPath(startCity, endCity, forbiddenCities);
}
}
12
