Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Графы, Поиск в глубину 
:(
    Опции темы
radiokiller
Дата 22.5.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



Ребят, помогите пожалуйста решить задачу!
Найти наибольший цикл во взвешенном графе, проходящий через обязательные вершины C и D и не проходящий через вершину A.
вот что у меня получилось
Код

Const NMAX = 9;                     { Максимальное количество вершин графа }

Type TMatr = Array[1..NMAX, 1..NMAX] of Integer; { тип матрицы смежности }
         TVek = Array[1..NMAX] of Integer; { тип массива для стека St и массива M
                                         для отметок о прохождении вершин }

Const A: TMatr = ( (0,1,0,1,0,0,0,1,0),  
                   (1,0,1,0,0,1,0,0,0),
                   (0,1,0,1,1,0,1,0,0),
                   (1,0,1,0,0,0,1,0,0),
                   (0,0,1,0,0,0,0,1,1),
                   (0,1,0,0,0,0,0,0,0),
                   (0,0,1,1,0,0,0,0,0),
                   (1,0,0,0,1,0,0,0,0),
                   (0,0,0,0,1,0,0,0,0) );     { матрица смежности }


procedure TForm1.Button1Click(Sender: TObject);
Var Vn: Integer; { начальная вершина пути }
    Vk: Integer; { конечная вершина пути }
    C : Integer; { обязательная вершина }
    D: Integer; {обязательная вершина}
    N: Integer; {количество вершин в графе}
    B: Integer; {вершина, которую цикл не должен содержать}
    StMax:TVek;
    KsStMax:Integer;
    I: Integer;  { параметр цикла }

Procedure AllP(    A : TMatr;    { матрица смежности }
                   N : Integer;  { количество вершин графа }
                   Vn: Integer;  { начальная вершина пути }
                   Vk: Integer;  { конечная вершина пути }
                   C : Integer;  { обязательная вершина }
                   D: Integer; {обязательная вершина}
                   B: Integer;  {вершина, которую цикл не должен содержать}
               Var StMax: TVek;{стек, содержащий наибольший цикл}
               Var KsStMax: Integer {количество элементов в стеке}
               );

Var St: TVek; { Стек }
    I : Integer; { параметр цикла }
    J : Integer; { параметр цикла }
    Ks: Integer; { указатель верхушки стека }
    V : Integer; { текущая вершина }
    M : TVek;    { массив для отметок о прохождении вершин }

Begin

 For J := 1 To N Do { обнуление массива о прохождении вершин }
  M[J] := 0;
 Ks := 1;         { указатель верхушки стека }
 St[Ks] := Vn;    { занесение в стек начальной вершины }
 M[Vn] := N + 1;  { отмечаем посещение вершины Vn }

 M[Vk] := N + 1;  { отмечаем посещение вершины Vk,
                    чтобы она не включалась в путь как промежуточная }

 J :=0;
 Repeat             
  V := St[Ks];    { номер текущей вершины V берём из стека }
  Repeat          { цикл поиска смежной вершины J }
   J := J + 1;
   If ((A[V,J] = 1) And (J = Vk)) { нашли конечную вершину Vk }
    Then
     Begin
      I := 1;                               { проверка обязательной вершины C, D }
      While ((St[I] <> C) And (St[I] <> D) And (St[I] = B) And (I <= Ks)) Do {  в найденном пути (в стеке) }
       I := I + 1;
      If ((I = Ks) And ((V = C) And (Vn = D) Or (V = D) And (Vn = C)) And (Ks>KsStMax))
       Then         { найден очередной путь }
        Begin
         For I := 1 To Ks Do             { вывод пути (содержимого стека) }
          StMax[I]:=St[I];
          KsStMax:=Ks;
        End;
     End;
  Until ((J > N) Or
         (A[V,J] = 1) And
         (M[J] = 0));
  If J > N
   Then     { шаг назад, ексли V-ая вершина исчерпана, из неё некуда пойти }
    Begin         { убираем из стека текущую вершину V }
     J := V;        { чтобы искать смежную вершину, начиная с вершины V+1 }
     M[V] := 0;    { чтобы использовать эту вершину в другом пути }
     Ks := Ks - 1;  { перемещаем указатель стека вниз }
    End
   Else           { шаг вперёд, если подходящая смежная вершина найдена }
    Begin
     Ks := Ks + 1; { величиваем указатель стека }
     St[Ks] := J; { заносим в стек найденную вершину J }
     M[J] := V;   { отмечаем посещение вершины J и запоминаем "отца" (предка) }
     J := 0;  { чтобы начать поиск смежной вершины с 1-ой }
    End;
 Until Ks = 0; { рассмотрены все варианты путей }
End;

begin

Vn := StrToInt(EditVn.Text);
Vk := StrToInt(EditVk.Text);
C  := StrToInt(EditC.Text);
D :=StrToInt(EditD.Text);
B :=StrToInt(EditB.Text);

AllP(A, NMAX, Vn, Vk, C, D, B, StMax, KsStMax); { находим все варианты путей из Vn в Vk через C и D }

If (KsStMax=N+1)
 Then      
  Begin
   EditR.Text := 'Нет ни одного такого цикла';
   For I := 1 To NMAX Do   { очищаем от старых решений }
    StringGrid1.Cells[I - 1,0] := '';
  End
 Else
  Begin
   EditR.Text := '';
   For I:=1 To KsStMax Do
    StringGrid1.Cells[I-1,0]:=IntToStr(StMax[I]);
    StringGrid1.Cells[KsStMax,0]:=IntToStr(Vn);
  End;
end;

end.

вот только она не работает(((

M
MetalFan
Для правильной вставки кода программ есть кнопка "код"


Это сообщение отредактировал(а) MetalFan - 23.5.2011, 18:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0643 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.