Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

сд6

.pdf
Скачиваний:
3
Добавлен:
01.12.2024
Размер:
361.3 Кб
Скачать

// Вывод содержимого матрицы 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

Соседние файлы в предмете Структуры данных