Алгоритм Дейкстры - Вывести не только вес ребер, но и сам путь - PascalABC.NET
Формулировка задачи:
Необходимо вывести не только вес ребер, но и сам путь, например: 1-3-5. Помогите, пожалуйста.
Решение задачи: «Алгоритм Дейкстры - Вывести не только вес ребер, но и сам путь»
textual
Листинг программы
const n = 6; inf = 100000; type mas1 = array[1..n, 1..n] of integer; mas2 = array[1..n] of boolean; mas3 = array[1..n] of integer; const GM: mas1 = //матрица смежности графа ( (0, 9, 1, 4, 0, 0), //1 (0, 0, 0, 0, 0, 0), //2 (1, 0, 0, 3, 2, 4), //3 (4, 0, 3, 0, 0, 1), //4 (0, 0, 2, 0, 0, 2), //5 (0, 0, 4, 1, 2, 0) //6 ); procedure Dijkstra(GM: mas1; st: integer); var count, index, i, u, m, min: integer; distance: mas3;//найденные пути from: mas3;//из какой вершины пришли visited: mas2;//массив посещенных вершин procedure printway(k: integer);//вывод кратчайшего пути begin if (from[k] <> m) and (k <> m) then begin printway(from[k]); write(' > '); end; write(k); end; begin m := st; for i := 1 to n do begin distance[i] := inf; visited[i] := false; end; distance[st] := 0; for count := 1 to n - 1 do begin min := inf; for i := 1 to n do if (not visited[i]) and (distance[i] <= min) then begin min := distance[i]; index := i; end; u := index; visited[u] := true; for i := 1 to n do if (not visited[i]) and (GM[u, i] <> 0) and (distance[u] <> inf) and (distance[u] + GM[u, i] < distance[i]) then begin distance[i] := distance[u] + GM[u, i];//вычисляется стоимость маршрута from[i] := u end; end; write('Стоимость пути из начальной вершины до остальных:'); writeln; for i := 1 to n do begin write(m, ' > ', i, ' = '); if distance[i] = inf then writeln('маршрут недоступен') else begin write(distance[i], ' Путь: ', m, ' > '); printway(i); writeln end; end; end; begin dijkstra(gm, 1); end.
Объяснение кода листинга программы
- В начале определены константы: n = 6 (количество вершин графа), inf = 100000 (бесконечность), GM (матрица смежности графа).
- Далее, в процедуре Dijkstra, объявлены вспомогательные переменные: count, index, i, u, m, min.
- Также, объявлены две переменные: distance (найденные пути) и from (из какой вершины пришли).
- Есть еще одна вспомогательная процедура printway, которая выводит кратчайший путь.
- В основной части программы начинается с выбора начальной вершины (m = 1).
- Затем, в цикле for, все вершины помечаются как не посещенные и устанавливаются в бесконечность, кроме m, который равен 0.
- Цикл while ищет кратчайший путь от m до всех остальных вершин.
- На каждой итерации, находится вершина с наименьшим расстоянием (min), и если она не посещена, то происходит поиск пути от нее до других вершин.
- Если найденный путь короче, чем текущий, то обновляется текущий путь и запоминается предыдущая вершина.
- После окончания цикла, выводится стоимость пути от начальной вершины до остальных вершин.
- Для каждой вершины выводится ее номер, путь от начальной вершины до нее и стоимость этого пути.
- Если путь недоступен (равен бесконечности), то выводится соответствующее сообщение.
- Если путь доступен, то выводится путь и его стоимость.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д