Алгоритм Дейкстры - Вывести не только вес ребер, но и сам путь - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Необходимо вывести не только вес ребер, но и сам путь, например: 1-3-5. Помогите, пожалуйста.
Листинг программы
  1. const n=6;inf=100000;
  2. type
  3. mas1=array[1..n, 1..n] of integer;
  4. mas2=array[1..n] of boolean;
  5. mas3=array[1..n] of integer;
  6. var
  7. s: integer;
  8. visited: mas2;//массив посещенных вершин
  9. const GM: mas1 = //матрица смежности графа
  10. (
  11. (0, 9, 1, 4, 0, 0), //1
  12. (0, 0, 0, 0, 0, 0), //2
  13. (1, 0, 0, 3, 2, 4), //3
  14. (4, 0, 3, 0, 0, 1), //4
  15. (0, 0, 2, 0, 0, 2), //5
  16. (0, 0, 4, 1, 2, 0) //6
  17. );
  18.  
  19. procedure Dijkstra(GM: mas1; st: integer);
  20. var count, index, i, u, m, min: integer;
  21. distance:mas3;//найденные пути
  22. visited: array[1..n] of boolean;//массив посещенных вершин
  23. begin
  24. m:=st;
  25. for i:=1 to n do
  26. begin
  27. distance[i]:=inf; visited[i]:=false;
  28. end;
  29. distance[st]:=0;
  30. for count:=1 to n-1 do
  31. begin
  32. min:=inf;
  33. for i:=1 to n do
  34. if (not visited[i]) and (distance[i]<=min) then
  35. begin
  36. min:=distance[i]; index:=i;
  37. end;
  38. u:=index;
  39. visited[u]:=true;
  40. for i:=1 to n do
  41. if (not visited[i]) and (GM[u, i]<>0) and (distance[u]<>inf) and
  42. (distance[u]+GM[u, i]<distance[i]) then
  43. distance[i]:=distance[u]+GM[u, i];//вычисляется стоимость маршрута
  44. end;
  45. write('Стоимость пути из начальной вершины до остальных:'); writeln;
  46. for i:=1 to n do
  47. if distance[i]<>inf then
  48. writeln(m,' > ', i,' = ', distance[i])
  49. else writeln(m,' > ', i,' = ', 'маршрут недоступен');
  50. end;

Решение задачи: «Алгоритм Дейкстры - Вывести не только вес ребер, но и сам путь»

textual
Листинг программы
  1. const
  2.   n = 6;
  3.   inf = 100000;
  4.  
  5. type
  6.   mas1 = array[1..n, 1..n] of integer;
  7.   mas2 = array[1..n] of boolean;
  8.   mas3 = array[1..n] of integer;
  9.  
  10. const
  11.   GM: mas1 = //матрица смежности графа
  12.   (
  13.   (0, 9, 1, 4, 0, 0), //1
  14.    
  15.   (0, 0, 0, 0, 0, 0), //2
  16.    
  17.   (1, 0, 0, 3, 2, 4), //3
  18.    
  19.   (4, 0, 3, 0, 0, 1), //4
  20.    
  21.   (0, 0, 2, 0, 0, 2), //5
  22.    
  23.   (0, 0, 4, 1, 2, 0)  //6
  24.   );
  25.  
  26. procedure Dijkstra(GM: mas1; st: integer);
  27.   var
  28.     count, index, i, u, m, min: integer;
  29.     distance: mas3;//найденные пути
  30.     from: mas3;//из какой вершины пришли
  31.     visited: mas2;//массив посещенных вершин
  32.   procedure printway(k: integer);//вывод кратчайшего пути
  33.   begin
  34.     if (from[k] <> m) and (k <> m) then
  35.     begin
  36.       printway(from[k]);
  37.       write(' > ');
  38.     end;
  39.     write(k);
  40.   end;
  41.   begin
  42.     m := st;
  43.     for i := 1 to n do
  44.     begin
  45.       distance[i] := inf;
  46.       visited[i] := false;
  47.     end;
  48.     distance[st] := 0;
  49.     for count := 1 to n - 1 do
  50.     begin
  51.       min := inf;
  52.       for i := 1 to n do
  53.         if (not visited[i]) and (distance[i] <= min) then
  54.         begin
  55.           min := distance[i];
  56.           index := i;
  57.         end;
  58.       u := index;
  59.       visited[u] := true;
  60.       for i := 1 to n do
  61.         if (not visited[i]) and (GM[u, i] <> 0) and (distance[u] <> inf) and
  62.         (distance[u] + GM[u, i] < distance[i]) then
  63.         begin
  64.           distance[i] := distance[u] + GM[u, i];//вычисляется стоимость маршрута
  65.           from[i] := u
  66.         end;
  67.     end;
  68.     write('Стоимость пути из начальной вершины до остальных:');
  69.     writeln;
  70.     for i := 1 to n do
  71.     begin
  72.       write(m, ' > ', i, ' = ');
  73.       if distance[i] = inf then writeln('маршрут недоступен')
  74.       else
  75.       begin
  76.         write(distance[i], ' Путь: ', m, ' > ');
  77.         printway(i);
  78.         writeln
  79.       end;
  80.     end;
  81.   end;
  82.  
  83. begin
  84.   dijkstra(gm, 1);
  85. end.

Объяснение кода листинга программы

  1. В начале определены константы: n = 6 (количество вершин графа), inf = 100000 (бесконечность), GM (матрица смежности графа).
  2. Далее, в процедуре Dijkstra, объявлены вспомогательные переменные: count, index, i, u, m, min.
  3. Также, объявлены две переменные: distance (найденные пути) и from (из какой вершины пришли).
  4. Есть еще одна вспомогательная процедура printway, которая выводит кратчайший путь.
  5. В основной части программы начинается с выбора начальной вершины (m = 1).
  6. Затем, в цикле for, все вершины помечаются как не посещенные и устанавливаются в бесконечность, кроме m, который равен 0.
  7. Цикл while ищет кратчайший путь от m до всех остальных вершин.
  8. На каждой итерации, находится вершина с наименьшим расстоянием (min), и если она не посещена, то происходит поиск пути от нее до других вершин.
  9. Если найденный путь короче, чем текущий, то обновляется текущий путь и запоминается предыдущая вершина.
  10. После окончания цикла, выводится стоимость пути от начальной вершины до остальных вершин.
  11. Для каждой вершины выводится ее номер, путь от начальной вершины до нее и стоимость этого пути.
  12. Если путь недоступен (равен бесконечности), то выводится соответствующее сообщение.
  13. Если путь доступен, то выводится путь и его стоимость.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы