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

СД Практика 6

.pdf
Скачиваний:
4
Добавлен:
17.06.2025
Размер:
484 Кб
Скачать
☆

{

Console.Write(i + "\t"); for (int j = 0; j < n; j++)

{

if (graph[i, j] == int.MaxValue)

{

Console.Write("0\t");

}

else

{

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

}

}

Console.WriteLine();

}

}

private (int[] distances, int[] previous) Dijkstra(int src)

{

int[] distances = new int[n]; int[] previous = new int[n]; bool[] visited = new bool[n]; for (int i = 0; i < n; i++)

{

distances[i] = int.MaxValue; visited[i] = false; previous[i] = -1;

}

distances[src] = 0;

var priorityQueue = new SortedSet<(int distance, int node)>(); priorityQueue.Add((0, src));

while (priorityQueue.Count > 0)

{

var (currentDist, u) = priorityQueue.Min; priorityQueue.Remove(priorityQueue.Min); if (visited[u])

continue; visited[u] = true;

for (int v = 0; v < n; v++)

{

if (graph[u, v] != int.MaxValue && !visited[v])

{

int newDist = currentDist + graph[u, v]; if (newDist < distances[v])

11

{

priorityQueue.Remove((distances[v], v)); distances[v] = newDist;

previous[v] = u; priorityQueue.Add((newDist, v));

}

}

}

}

return (distances, previous);

}

private List<int> GetPath(int src, int dest, int[] previous)

{

List<int> path = new List<int>();

for (int at = dest; at != -1; at = previous[at])

{

path.Add(at);

}

path.Reverse();

if (path[0] == src) return path;

return new List<int>();

}

public void MaxShortestPathFrom(int A)

{

var (distances, previous) = Dijkstra(A); int maxDistance = int.MinValue;

int maxCity = -1;

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

{

if (i != A && distances[i] != int.MaxValue && distances[i] > maxDistance)

{

maxDistance = distances[i]; maxCity = i;

}

}

if (maxCity != -1)

{

Console.WriteLine($"Город с максимальным кратчайшим расстоянием от {A}: {maxCity}, расстояние: {maxDistance}");

List<int> path = GetPath(A, maxCity, previous); Console.WriteLine("Путь: " + string.Join(" -> ", path));

12

}

else

{

Console.WriteLine($"Не найдено путей из города {A}.");

}

}

}

class Program

{

static void Main()

{

Console.WriteLine("Введите количество узлов:"); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите количество ребер:"); int m = Convert.ToInt32(Console.ReadLine()); Graph graph = new Graph(n);

graph.Random(m);

Console.WriteLine("Матрица смежности графа:"); graph.Print();

Console.WriteLine("\nВведите город A для поиска максимального кратчайшего

пути:");

int A = Convert.ToInt32(Console.ReadLine()); graph.MaxShortestPathFrom(A);

}

}

13

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