Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 10.05.2020
Сообщений: 5
1

Алгоритм Дейкстры

10.05.2020, 23:05. Показов 1239. Ответов 4

Author24 — интернет-сервис помощи студентам
Стоит задача использовать на звешенном графе алгоритм в Pascal, и как пример - данный код. Код явно взят с какого другого сайта, не работает в PascalABCNET, выдавая ошибку "help.pas(14) : Тип параметра или возвращаемого значения не может быть описанием записи или описанием массива с границами".
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
program DijkstraAlgorithm;
uses crt;
const V=6; inf=100000;
type vektor=array[1..V] of integer;
var start: integer;
const GR: array[1..V, 1..V] of integer=(
(0, 1, 4, 0, 2, 0),
(0, 0, 0, 9, 0, 0),
(4, 0, 0, 7, 0, 0),
(0, 9, 7, 0, 0, 2),
(0, 0, 0, 0, 0, 8),
(0, 0, 0, 0, 0, 0));
{алгоритм Дейкстры}
procedure Dijkstra(GR: array[1..V, 1..V] of integer; st: integer);
var count, index, i, u, m, min: integer;
distance: vektor;
visited: array[1..V] of boolean;
begin
m:=st;
for i: integer :=1 to V do
begin
distance[i]:=inf; visited[i]:=false;
end;
distance[st]:=0;
for count: integer :=1 to V-1 do //й
begin
min:=inf;
for i: integer :=1 to V do
if (not visited[i]) and (distance[i]<=min) then
begin
min:=distance[i]; index:=i;
end;
u:=index;
visited[u]:=true;
for i: integer :=1 to V do
if (not visited[i]) and (GR[u, i]<>0) and (distance[u]<>inf) and
(distance[u]+GR[u, i]<distance[i]) then
distance[i]:=distance[u]+GR[u, i];
end;
write('Стоимость пути из начальной вершины до остальных: '); writeln;
for i: integer :=1 to V do
if distance[i]<>inf then
writeln(m,' > ', i,' = ', distance[i])
else writeln(m,'>', i,' = ', 'маршрут недоступен');
end;
{основной блок программы}
begin
clrscr;
write('Начальная вершина >> '); read(start);
Dijkstra(GR, start);
end.
Подскажите, что не так, пытаюсь разобраться, так понимаю что в строке "procedure Dijkstra(GR: array[1..V, 1..V] of integer; st: integer);" я хочу слишком многого, но как разделить - не знаю.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2020, 23:05
Ответы с готовыми решениями:

Линейный алгоритм, Алгоритм с ветвлениями, Циклический алгоритм Линейный алгоритм
Линейный алгоритм, Алгоритм с ветвлениями, Циклический алгоритм Линейный алгоритм 1. Объясни, что...

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void lab...

Волновой алгоритм поиска (Алгоритм A* / Алгоритм А стар)
Хочу разработать алгоритм для решения головоломки с подвижными дисками (перестановочная...

Разработать алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм
Расставить строки данной матрицы в порядке возрастания наибольших элементов в строках.

4
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
11.05.2020, 05:14 2
array[1..V, 1..V] of integer — вынести в отдельный тип, как это сделано с vektor
И в константе и процедуре использовать уже его.

И что за странные конструкции во всех циклах типа for i: integer :=1 to V do?
Либо параметры цикла из описания переменных убрать и описывать в самих циклах, либо integer-ы поубирать!
0
0 / 0 / 0
Регистрация: 10.05.2020
Сообщений: 5
11.05.2020, 09:09  [ТС] 3
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
program DijkstraAlgorithm;
uses crt;
const V=6; inf=100000;
type vektor=array[1..V] of integer;
     test=array[1..V, 1..V] of integer;
var start: integer;
const GR: array[1..V, 1..V] of integer=(
(0, 1, 4, 0, 2, 0),
(0, 0, 0, 9, 0, 0),
(4, 0, 0, 7, 0, 0),
(0, 9, 7, 0, 0, 2),
(0, 0, 0, 0, 0, 8),
(0, 0, 0, 0, 0, 0));
{алгоритм Дейкстры}
procedure Dijkstra(GR: test; st: integer);
Вот что вышло, правильно?
Теперь в 51 строке "Dijkstra(GR, start);" ошибка help.pas(51) : Нельзя преобразовать тип array [1..6] of array [1..6] of integer к array [1..6] of array [1..6] of integer
0
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
11.05.2020, 10:32 4
Лучший ответ Сообщение было отмечено 343intact как решение

Решение

Внимательно читаем вторую строку: https://www.cyberforum.ru/post14527712.html
0
1178 / 429 / 194
Регистрация: 23.03.2020
Сообщений: 1,016
Записей в блоге: 1
14.08.2020, 18:21 5
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
const Inf = 99; //бесконечность
 
procedure Deikstr(s: integer; a: array[,] of integer);
//s - искомая вершина (необходимо найти путь от s до остальных)
begin    
 var n := a.Size[0] - 1;
 var visited:= |false| * (n+1); //массив посещённости вершин
 visited[s] := TRUE; //вершина S посещена
 var D :=  a.Row(s); //массив кратчайших расстояний
 var P := |s| * (n+1);//массив предков, который поможет определить маршрут. 
//p[i] будет содержать предпоследнюю вершину кратчайшего маршрута от s до i
 (D[s], p[s]) := (0, inf);
 
 loop n-2 do //на каждом шаге находим миним. решение и пытаемся его улучшить
 begin 
  var (min, v) := (Inf, 0);
    
  for var j := 1 to N do
   if (not visited[j]) and (D[j] < min) then (min, v) := (D[j], j); 
                                  //(мин.расстояние, найденная вершина)
    
  for var k := 1 to N do
   if (D[k] > D[v] + A[v, k]) and (D[v] < inf) and (A[v, k] < inf) then
      (D[k], p[k]) := ( D[v] + A[v, k],  v ); // Если расстояние больше 
        // чем сумма расстояния до тек.вершины и длины ребра, то уменьшаем его
   
  visited[v] := TRUE; // и она отмечается посещенной
 end;
  
 for var f := 1 to n do 
 begin
  if f = s then continue;  
  $'{s}->{f}'.Print;
  if (d[f]= inf) or (p[f] = inf) then begin $'путь не сущствует'.Println; continue; end
  else $'({d[f]}):'.PadRight(6).Print;
  var (st, z) := ('', p[f]); 
  var c := a[p[f], f]; //Расстояние
   
  while z <> inf do
  begin
   st := z.ToString + ' -('+ c + ')> ' + st; //заносим в маршрут
   if p[z] <> inf then c := a[p[z], z]; // Расстояние
   z := p[z]; //переходим к следующей вершине
  end;
 
  st += f.ToString; //в маршрут записываем начальную вершину
  Writeln(st);  
 end;
end;
 
procedure GenGr(a: array[,] of integer; n, m: integer);
begin
  var c := 0;
  while c <> m do
  begin
   var i := Random(1,n-1);
   var j := Random(i+1,n);
   if a[i, j] = 0 then begin a[i,j] := Random(1, 9); a[j,i] := a[i,j]; inc(c);end;
  end; 
  a.MatrSlice(1,n,1,n).Println(2);
  a.Transform(n -> n = 0 ? inf : n);   
end;
 
begin
  var n, m, s: integer;
  
  repeat $'Всего вершин (не более 10):'.Print
  until ReadlnString.TryToInteger(n) and (n in 2..10);  
  var mMax := n*(n-1) div 2;
  repeat $'Всего ребер (не более {mMax}):'.Print
  until ReadlnString.TryToInteger(m) and (m in 0..mMax);
  repeat $'Точка старта (1..{n}):'.Print
  until ReadlnString.TryToInteger(s) and (s in 1..n);
 
  var a := new integer[n+1, n+1];
  GenGr(a, n, m);  // Генерируем матрицу смежности с выводом
  Deikstr(s, a);
end.
0
14.08.2020, 18:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.08.2020, 18:21
Помогаю со студенческими работами здесь

Алгоритм устранения непродуктивных нетерминалов, алгоритм построения недостижимых символов
Задание: найдите лишние нетерминалы в следующей грамматике с начальным нетерминалом S и в...

Построить алгоритм Маркова, который ищет НОД (Алгоритм Евклида)
Здравствуйте, ребята, выручайте. Весь инет перерыл, всю голову сломал, но не могу сделать. Суть в...

Построить алгоритм ДО и алгоритм ПОКА для вычислений значения функции на отрезке [a,b] с шагом h.
Построить алгоритм ДО и алгоритм ПОКА для вычислений значения функции на отрезке с шагом h....

При каком минимальном значении n алгоритм с O=100n^2, работает быстрее, чем алгоритм с O=2n^2?
Всем, привет! Возможно, я не первый с таким вопросом по книге Кормена, но всё ... Есть там такое...

Вывести элементы, присутствующие в обоих массивах А и В. Алгоритм сортировки - подсчетом, алгоритм поиска - двоичный
Вывести элементы, присутствующие в обоих массивах А и В. Алгоритм сортировки - подсчетом, алгоритм...

Составить алгоритм-вычисление квадрата суммы двух чисел и алгоритм для вычисления функции
Здравствуйте!Мне нужно все с самого начала и точно,помогите пожалуйста! 1.составить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru