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

Практики / ПР6 / СД_П6

.pdf
Скачиваний:
6
Добавлен:
27.06.2025
Размер:
328.24 Кб
Скачать

}

public void AddEdge(int u, int v, int weight)

{

if (u >= numCities || v >= numCities || u < 0 || v < 0) // проверка индексов

{

throw new IndexOutOfRangeException("Ошибка! Указанный город не существует.");

}

if (weight <= 0) // проверка индексов

{

throw new ArgumentException("Расстояние между городами должно быть положительным числом.");

}

adjMatrix[u, v] = weight; // добавление ребра в матрицу для ориентированного графа

}

public void PrintAdjMatrix()

{

Console.WriteLine("Матрица смежности:"); for (int i = 0; i < numCities; i++)

{

for (int j = 0; j < numCities; j++)

{

if (adjMatrix[i, j] == int.MaxValue / 2) Console.Write("!\t");

11

else

Console.Write(adjMatrix[i, j] + "\t");

}

Console.WriteLine();

}

}

public int[,] FloydWarshall()

{

int[,] dist = new int[numCities, numCities];

for (int i = 0; i < numCities; i++) // копируем данные из матрицы смежности в матрицу расстояний

{

for (int j = 0; j < numCities; j++)

{

dist[i, j] = adjMatrix[i, j];

}

}

for (int k = 0; k < numCities; k++) // применяем алгоритм Флойда-Уоршелла

{

for (int i = 0; i < numCities; i++)

{

for (int j = 0; j < numCities; j++)

{

if (dist[i, j] > dist[i, k] + dist[k, j])

{

12

dist[i, j] = dist[i, k] + dist[k, j];

}

}

}

}

return dist;

}

public int FindCityWithMaxTotalDistance()

{

int[,] dist = FloydWarshall(); int maxCity = -1;

int maxDistance = -1;

for (int i = 0; i < numCities; i++) // проходим по каждой строке матрицы расстояний

{

int sumDistance = 0;

for (int j = 0; j < numCities; j++) // суммируем расстояния до всех остольных городов

{

if (i != j && dist[i, j] != int.MaxValue / 2)

{

sumDistance += dist[i, j];

}

}

13

if (sumDistance > maxDistance) // обновляем значение города с большей суммой расстояний

{

maxDistance = sumDistance; maxCity = i;

}

}

return maxCity;

}

}

class Program

{

static void Main(string[] args)

{

Console.Write("Сколько городов (узлов)? "); int numCities = int.Parse(Console.ReadLine());

Console.Write("Сколько дорог (рёбер)? "); int numRoads = int.Parse(Console.ReadLine());

Graph graph = new Graph(numCities);

for (int i = 1; i <= numRoads; i++)

{

bool running = true;

while (running)

14

{

try

{

Console.WriteLine($"Ввод для дороги {i}: введите начальный город, конечный город и расстояние в формате X,Y,Z");

string input = Console.ReadLine();

string[] parts = input.Split(','); if (parts.Length != 3)

{

throw new FormatException("Неверный формат ввода. Используйте формат X,Y,Z.");

}

int u = int.Parse(parts[0]); int v = int.Parse(parts[1]);

int weight = int.Parse(parts[2]);

graph.AddEdge(u, v, weight); running = false;

}

catch (FormatException ex)

{

Console.WriteLine($"Ошибка формата: {ex.Message}. Повторите

ввод.");

}

catch (ArgumentException ex)

{

Console.WriteLine($"Ошибка аргумента: {ex.Message}. Повторите

ввод.");

15

}

catch (IndexOutOfRangeException ex)

{

Console.WriteLine($"Ошибка индекса: {ex.Message}. Повторите

ввод.");

}

}

}

graph.PrintAdjMatrix();

int city = graph.FindCityWithMaxTotalDistance(); if (city != -1)

{

Console.WriteLine($"Город с максимальной суммой кратчайших расстояний до остальных городов: {city}");

}

else

{

Console.WriteLine("Не удалось найти такой город.");

}

}

}

16

Соседние файлы в папке ПР6