Процедура поиска в глубину в графе, заданном списками инцидентности - Pascal ABC

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

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

Нужна помощь знающего Паскаль человека, по заданию: Напишите и используйте в программе процедуру поиска в глубину в графе, заданном списками инцидентности. Выведите на экран номера вершин в том порядке, в котором они просматриваются процедурой. Буду очень признателен за помощь!

Решение задачи: «Процедура поиска в глубину в графе, заданном списками инцидентности»

textual
Листинг программы
  1. Program P62;
  2.  
  3. Const MAX_VERT = 100;
  4.  
  5. Var LstS    : Array[1..MAX_VERT,1..MAX_VERT] of integer;
  6. Var Chk     : Array[1..MAX_VERT] of integer;
  7. Var CurrN   : integer;
  8. Var finp    : Text;
  9. Var i,j,l,k : integer;
  10. Var Stri,s,tmp : String;
  11.  
  12. Function isBound(i,j : integer) : Boolean;
  13. Var k : integer;
  14. Begin
  15.      for k:=1 to CurrN Do
  16.          if LstS[i,k]=j Then Begin
  17.             isBound:=True;
  18.             exit;
  19.          End;
  20.      For k:=1 to CurrN Do
  21.          if LstS[j,k]=i Then Begin
  22.             isBound:=True;
  23.             exit;
  24.          End;
  25.      isBound:=False;
  26. End;
  27.  
  28. Procedure DFS(n : integer);
  29. Var i : integer;
  30. Begin
  31.  
  32.      Chk[n]:=1;
  33.  
  34.      for i:=1 to  CurrN Do
  35.          if (Chk[i]=0) And (isBound(i,n)) Then Begin
  36.             writeln(n,' - ',i);
  37.             DFS(i);
  38.          end;
  39.          
  40. End;
  41.  
  42. Begin
  43.  
  44.     for i:=1 to MAX_VERT Do Begin
  45.         Chk[i]:=0;
  46.         for j:=1 to MAX_VERT Do
  47.             Lsts[i,j]:=0;
  48.     end;
  49.  
  50.     assign(finp,'graph.txt');
  51.     reset(finp);
  52.  
  53.     readln(finp,CurrN);
  54.    
  55.     for i:=1 to CurrN Do Begin
  56.         readln(finp,Stri);
  57.         Stri:=Stri+',';
  58.         l:=length(Stri);
  59.         tmp:='';
  60.         k:=1;
  61.         for j:=1 to l Do Begin
  62.             s:=Stri[j];
  63.             if s <> ' ' then
  64.                if s = ',' then Begin
  65.                   if tmp <> '' then Begin
  66.                      Lsts[i,k]:=strToint(tmp);
  67.                      tmp:='';
  68.                      k:=k+1;
  69.                   End;
  70.                 End
  71.                Else
  72.                   tmp:=tmp+s;
  73.         End;
  74.     End;
  75.    
  76.     Close(finp);
  77.    
  78.     DFS(1);
  79.  
  80.     writeln;
  81.  
  82. End.

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

  1. В программе объявлены три переменные: LstS, Chk и CurrN. LstS - это массив, который представляет собой список инцидентности для графа. Chk - это массив, который используется для отслеживания посещенных вершин в процессе обхода графа. CurrN - это переменная, которая хранит текущую вершину, которую мы исследуем.
  2. В функции isBound проверяется, является ли текущая вершина (i) соседней для вершины, которую мы исследуем (n). Если это так, то функция возвращает True и выходит из цикла. Если нет, то функция проверяет, является ли вершина n соседней для вершины i. Если это так, то она также возвращает True и выходит из цикла. Если ни одно из этих условий не выполняется, функция возвращает False.
  3. В процедуре DFS вызывается функция isBound для проверки того, что все вершины до текущей вершины были исследованы. Если это так, то текущая вершина записывается в файл вместе с ее индексом. Затем вызывается рекурсивно DFS для исследования всех соседних вершин.
  4. В начале программы создаются два массива: LstS и Chk. Затем считывается количество вершин из файла и сохраняется в переменной CurrN. Для каждой вершины в массиве LstS считывается значение и сохраняется в массиве Stri. Значение каждой вершины в Stri накапливается, пока не достигнется пробел или запятая, после чего оно преобразуется в целое число и сохраняется в массиве LstS.
  5. Затем вызывается функция DFS, передавая ей 1 в качестве аргумента. Это означает, что мы начинаем обход графа с вершины 1. В процессе обхода каждая соседняя вершина исследуется рекурсивно.
  6. В конце программы вызывается функция isBound для проверки того, что все вершины были исследованы. Если это так, то все вершины считаются посещенными, и программа завершается.

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


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

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

8   голосов , оценка 4.125 из 5

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

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

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