СД Практика 6
.pdf{
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
