Помогите решить две простых задачки на Паскале

Ответить
coddex
Сообщения: 3
Зарегистрирован: 22 окт 2006, 18:00
Контактная информация:

Найти кратчайшие пути от фиксированной вершины графа до всех остальных его вершин с помощью алгоритма Дейкстра. Граф задан списками смежности.

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


помогите пожалуйста... а то не знаю, как написать. Надо на паскале.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Не все я думаю помнят (или знают) алгоритм Дейкстра. :-)
It's a long way to the top if you wanna rock'n'roll
coddex
Сообщения: 3
Зарегистрирован: 22 окт 2006, 18:00
Контактная информация:

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

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.
coddex
Сообщения: 3
Зарегистрирован: 22 окт 2006, 18:00
Контактная информация:

Вот набросал начало первой программы, где задается граф списком смежности

Код: Выделить всё

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.
Тут список задается и выводится на экран. На сколько я понял из задания, именно так надо описать граф.
Помогите дописать пожалуйста.
Ответить