Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Поиск путей на графе в глубину

 

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

Рассмотрим следующую задачу. Имеется сеть железных дорог. По некоторым участкам движение возможно только в одном направлении. Известны расстояния всех участков дорог. Требуется перечислить все пути, ведущие из пункта А в пункт В, не проходящие дважды через один и тот же пункт. Приведем текст соответствующей программы.

Program Puti; { поиск путей в глубину на ориентированном графе }

Uses Crt;

Const

Max=20; { максимально допустимое число вершин графа }

Type

mat=array[1..Max,1..Max] of integer; {матрица смежности}

put=1..Max; { номер вершины в пути }

Var

Matr: mat;

M: set of put; { множество вершин, входящих в путь }

Gr: array [1..Max] of integer; { текущий путь }

A, B, Ver, K, I, J: integer;

L: boolean;

Ch: char;

Procedure ReadMat(var Matr: mat); {ввод матрицы смежности}

Begin

TextBackGround(Black);

TextColor(White);

ClrScr;

Write('Введите количество вершин графа: ');

ReadLn(Ver);

For I:=1 to Ver do

For J:=1 to Ver do

begin

Matr[I, J]:=0;

Matr[J, I]:=0

end;

Repeat

Write('Введите связи в виде пары вершин(-1-конец) ');

Read(I);

if I<>-1 then Read(J);

if (I>0) and (I<=Ver) and (J>0) and (J<=Ver) then

Matr[I,J]:=1

else if I<>-1 then WriteLn('Ошибка ввода ')

Until I = -1;

WriteLn('Ввод закончен!');

WriteLn;

ReadLn { пауза }

End;

Procedure Wiwod(Matr: Mat);

Begin

Window(46,2,75,22); { окно вывода результатов }

TextBackGround(Cyan);

ClrScr;

TextColor(LightGreen);

Write(' ');

For I:=1 to Ver do

Write(i:2); { номера столбцов матрицы }

WriteLn;

For I:=1 to Ver do

begin

TextColor(LightGreen);

Write(I:2); { номера строк матрицы }

TextColor(White);

For J:=1 to Ver do

Write(Matr[I,J]:2);

WriteLn

end

End;

Procedure PoiskPut(T: integer);

{ поиск всех путей на графе }

Var I: integer;

Begin

Gr[J]:=T; { добавление в путь текущей вершины }

M:=M+[T]; { коррекция множества вершин пути }

J:=J+1;

if T=B then { B - конечная вершина }

begin

Write('Найден путь: ');

For I:=1 to J-1 do { вывод пути }

Write(Gr[I], ' ');

WriteLn;

ReadLn { пауза }

end

else

For I:=1 to Ver do

if not (I in M) and (Matr[T,I]=1) then

{ поиск в глубину: выбор продолжения пути без цикла }

PoiskPut(I);

{ здесь оказываемся после нахождения очередного пути }

{ или в случае попадания в тупик }

M:=M-[T];

{ исключение из множества вершин пути последней вершины }

J:=J-1 { возврат в предыдущую вершину }

End;

Begin { основная программа }

ClrScr; { очистка экрана }

ReadMat(Matr); { ввод матрицы смежности }

L:=True;

While L do

begin

Wiwod(Matr);

WriteLn;

Write('Введите начальную вершину: ');

ReadLn(A);

Write('Введите конечную вершину: ');

ReadLn(B);

WriteLn;

J:=1; M:=[]; {инициализация множества вершин пути }

PoiskPut(A); { перечисление всех путей }

WriteLn('Путей больше нет! ');

Write('Повторить поиск (д/н)? ');

ReadLn(Ch);

if Ch='н' then L:=False { для выхода из цикла }

end

End.

В этой прграмме стек реализуется с помощью рекурсии. Рассмотрим порядок нахождения путей на примере. Пусть имеется граф

 
 

 

 


и требуется перечислить пути из вершины 1 в вершину 4. В процессе поиска в стеке будут находиться следующие номера вершин:

· 1;

· 1,3;

· 1,3,2;

· 1,3,2,4;

· 1,3,2;

· 1,3,2,5;

· 1,3,2,5,4;

· 1,3,2,5;

· 1,3,2;

· 1,3,4;

· 1,3;

· 1,3,6;

· 1,3;

· 1;

· 1,4;

· 1;

· Æ.

Последовательность обхода вершин графа можно представить деревом

 

 
 

 


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

 

<== предыдущая лекция | следующая лекция ==>
Пример программы с использованием матрицы смежности | Алгоритмы поиска кратчайших путей Дейкстры и Флойда
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 392; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.015 сек.