сд6
.pdf// Вывод содержимого матрицы for (int i = 0; i < vertices; i++)
{
Console.Write($"{i,3} | "); // Нумерация строк
for (int j = 0; j < vertices; j++)
{
if (adjMatrix[i, j] == int.MaxValue)
{
Console.Write(" ∞ ");
}
else
{
Console.Write($"{adjMatrix[i, j],5} ");
}
}
Console.WriteLine();
}
}
// Нахождение кратчайшего пути с использованием алгоритма Дейкстры с учетом исключения города C
public (int distance, List<int> path) ShortestPath(int A, int B, int C)
{
int[] dist = new int[vertices]; bool[] visited = new bool[vertices];
int[] prev = new int[vertices]; // Для восстановления пути
11
for (int i = 0; i < vertices; i++)
{
dist[i] = int.MaxValue; // Начальные расстояния бесконечны visited[i] = false;
prev[i] = -1; // Предыдущий узел не определён
}
dist[A] = 0; // Начальное расстояние до самого себя — 0
for (int i = 0; i < vertices; i++)
{
int u = MinDistance(dist, visited);
if (u == -1) break; // Если больше нет непосещенных вершин
visited[u] = true;
for (int v = 0; v < vertices; v++)
{
// Проверяем соседей, не посещенных и не город С
if (!visited[v] && adjMatrix[u, v] != int.MaxValue && u !=
C && v != C)
{
int newDist = dist[u] + adjMatrix[u, v]; if (newDist < dist[v])
{
dist[v] = newDist; prev[v] = u;
}
}
12
}
}
// Восстановление пути
List<int> path = new List<int>(); int current = B;
while (current != -1)
{
path.Insert(0, current); // Вставляем в начало списка current = prev[current];
}
// Если нет пути, возвращаем бесконечность if (dist[B] == int.MaxValue)
{
return (int.MaxValue, null);
}
return (dist[B], path);
}
// Метод для нахождения вершины с минимальным расстоянием среди непосещённых
private int MinDistance(int[] dist, bool[] visited)
{
int min = int.MaxValue; int minIndex = -1;
13
for (int v = 0; v < vertices; v++)
{
if (!visited[v] && dist[v] < min)
{
min = dist[v]; minIndex = v;
}
}
return minIndex;
}
// Генерация случайных дорог
public void GenerateRandomEdges(int edges, int maxWeight)
{
Random rand = new Random(); for (int i = 0; i < edges; i++)
{
int u = rand.Next(0, vertices); // случайный узел int v = rand.Next(0, vertices); // случайный узел
while (u == v) // избегаем петлей (ребер из узла в себя)
{
v = rand.Next(0, vertices);
}
int weight = rand.Next(1, maxWeight + 1); // случайный вес
ребра
AddEdge(u, v, weight); 14
}
}
}
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Выберите способ создания графа:");
Console.WriteLine("1. Ввод графа вручную");
Console.WriteLine("2. Случайная генерация графа");
Console.Write("Ваш выбор: ");
int choice = int.Parse(Console.ReadLine());
Graph graph;
if (choice == 1)
{
// Ввод вручную
Console.Write("Введите количество городов (вершин): "); int n = int.Parse(Console.ReadLine());
graph = new Graph(n);
Console.Write("Введите количество дорог (ребер): "); int m = int.Parse(Console.ReadLine());
Console.WriteLine("Введите дороги (формат: город1 город2
расстояние):");
15
for (int i = 0; i < m; i++)
{
string[] input = Console.ReadLine().Split(); int u = int.Parse(input[0]);
int v = int.Parse(input[1]);
int weight = int.Parse(input[2]);
graph.AddEdge(u, v, weight);
}
}
else if (choice == 2)
{
// Случайная генерация
Console.Write("Введите количество городов (вершин): "); int n = int.Parse(Console.ReadLine());
Console.Write("Введите количество дорог (ребер): "); int m = int.Parse(Console.ReadLine());
Console.Write("Введите максимальный вес дорог: "); int maxWeight = int.Parse(Console.ReadLine());
graph = new Graph(n); graph.GenerateRandomEdges(m, maxWeight);
Console.WriteLine("Граф сгенерирован.");
}
else
16
{
Console.WriteLine("Неверный выбор."); return;
}
graph.Print();
Console.Write("Введите город A: "); int A = int.Parse(Console.ReadLine());
Console.Write("Введите город B: "); int B = int.Parse(Console.ReadLine());
Console.Write("Введите город C (исключаемый): "); int C = int.Parse(Console.ReadLine());
var result = graph.ShortestPath(A, B, C);
if (result.distance == int.MaxValue)
{
Console.WriteLine($"Нет доступного пути из города {A} в город {B}, исключая город {C}.");
}
else
{
Console.WriteLine($"Кратчайший путь из города {A} в город
{B}, исключая город {C}: {result.distance}");
Console.WriteLine("Путь: " + string.Join(" -> ", result.path));
}
17
}
}
18
