}
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
