Найти кратчайшие пути от фиксированной вершины графа до всех остальных его вершин с помощью алгоритма Дейкстра. Граф задан списками смежности.
Написать программу, содержащую нерекурсивную процедуру, которая добавляет узел к бинарному дереву поиска. После завершения работы с динамическими структурами данных необходимо освободить занимаемую ими память.
помогите пожалуйста... а то не знаю, как написать. Надо на паскале.
Помогите решить две простых задачки на Паскале
Не все я думаю помнят (или знают) алгоритм Дейкстра. :-)
It's a long way to the top if you wanna rock'n'roll
Алгоритм Дейкстры
1 (инициализация). В цикле от 1 до N заполнить нулями массив
S; заполнить числом i массив C; перенести i-ю строку матрицы
A в массив B,
S:=1; C:=0 (i - номер стартовой вершины)
2 (общий шаг). Hайти минимум среди неотмеченных (т. е. тех k, для
которых S[k]=0); пусть минимум достигается на индексе j, т. е. B[j]<=B[k]
Затем выполняются следующие операции:
S[j]:=1;
если B[k] > B[j]+A[j,k], то (B[k]:=B[j]+A[j,k]; C[k]:=j)
(Условие означает, что путь Vi ... Vk длиннее, чем путь Vi...Vj Vk).
(Если все S[k] отмечены, то длина пути от Vi до Vk равна B[k]. Теперь
надо) перечислить вершины, входящие в кратчайший путь).
3 (выдача ответа). (Путь от Vi до Vk выдается в обратном порядке
следующей процедурой
3.1. z:=C[k];
3.2. Выдать z;
3.3. z:=C[z]. Если z = О, то конец,
иначе перейти к 3.2.
1 (инициализация). В цикле от 1 до N заполнить нулями массив
S; заполнить числом i массив C; перенести i-ю строку матрицы
A в массив B,
S:=1; C:=0 (i - номер стартовой вершины)
2 (общий шаг). Hайти минимум среди неотмеченных (т. е. тех k, для
которых S[k]=0); пусть минимум достигается на индексе j, т. е. B[j]<=B[k]
Затем выполняются следующие операции:
S[j]:=1;
если B[k] > B[j]+A[j,k], то (B[k]:=B[j]+A[j,k]; C[k]:=j)
(Условие означает, что путь Vi ... Vk длиннее, чем путь Vi...Vj Vk).
(Если все S[k] отмечены, то длина пути от Vi до Vk равна B[k]. Теперь
надо) перечислить вершины, входящие в кратчайший путь).
3 (выдача ответа). (Путь от Vi до Vk выдается в обратном порядке
следующей процедурой

3.1. z:=C[k];
3.2. Выдать z;
3.3. z:=C[z]. Если z = О, то конец,
иначе перейти к 3.2.
Вот набросал начало первой программы, где задается граф списком смежности
Тут список задается и выводится на экран. На сколько я понял из задания, именно так надо описать граф.
Помогите дописать пожалуйста.
Код: Выделить всё
program z2;
Type
TypeElement = string;
typestr = integer;
PtrRec = ^Rec;
Rec = Record
Stroka : Typestr;
Element : TypeElement;
pNext : PtrRec;
End;
Procedure Create_Ring (var pBegin: PtrRec);
Var pAux : PtrRec;
el : TypeElement;
k:typestr;
Begin
New (pBegin);
pAux := pBegin;
pAux^.pNext := Nil;
Write ('Vvedite spisok smejnosti');
Writeln ('Tochka - okonchanie vvoda grafa; Tire - okonchanie vvoda rebra');
ReadLn (el);
k:=1;
While el <> '.' do {formirovanie}
Begin
New (pAux^.pNext); {Risovanie rebra}
pAux := pAux^.pNext;
pAux^.Element := el;
pAux^.Stroka:=k;
pAux^.pNext := Nil;
ReadLn (el);
if el = '-' then begin {Zavershenie risovaniya rebra}
readln(el);
New (pAux^.pNext);
pAux := pAux^.pNext;
pAux^.Element :='0';
pAux^.Stroka:=k;
pAux^.pNext := Nil;
k:=k+1;
end;
End;
{sozdanie poslednego nil elementa}
New (pAux^.pNext);
pAux := pAux^.pNext;
pAux^.Element :='0';
pAux^.Stroka:=k;
pAux^.pNext := Nil;
pAux^.pNext := pBegin; {zamikanie}
WriteLn;
End;
Procedure Print_Ring (pBegin: PtrRec);
Var pAux : PtrRec;
Begin
pAux := pBegin^.pNext; {bez zaglavnogo zvena}
If pAux <> pBegin
Then
Begin
{poka ukazatel ne raven nachalu}
While pAux <> pBegin do
Begin
if pAux^.Element='0' then writeln(pAux^.Stroka,':Nil ') else
Write (pAux^.Stroka,':',pAux^.Element,' ');
pAux := pAux^.pNext;
End;
WriteLn;
End
End;
procedure ListClear ( var pAux: PtrRec);
begin
while pAux <> nil do
begin
dispose(pAux);
pAux:=nil;
end
end;
var str:ptrrec;
i,n:integer;
begin
Create_Ring(str);
writeln;
Writeln('Spisok smejnosti:');
Print_Ring(str);
{ListClear(str);}
readln;
end.
Помогите дописать пожалуйста.