Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
01.05.2014
Размер:
30.21 Кб
Скачать

ПОИСК ПО ГРАФУ

Procedure Search ( v0: Vert );

var Q : SetVert;

NewVert : Array [1..n] of Boolean;

global V : SetVert; {множество вершин графа G=(V,E), Card(V)=n }

Adj: array  [1..n] of  ListVert; { списки смежности }

begin

for  v  V do NewVert[v] := True; { - пометить все вершины как необследованные }

Q := { v0 };

NewVert[v0] := False;

while

Q { }

do

begin

v := произвольный элемент из Q; удалить v из Q;

посетить ( v );

for  u  Adj[v] do

if NewVert[u] then

begin

Q := Q + {u};

NewVert[u] := False

end {if-for} { вершина v - использована }

end {while}

end { Search }

ПОИСК В ШИРИНУ

( Breadth First Search - BFS )

Множество Q реализуется очередью q (раньше посетили - раньше использовали).

Заодно строится остовное дерево (T – множество древесных ребер)

procedure  BFS ( v0: Vert );

var  q : QueueVert;

NewVert :  Array  [1..n]  of  Boolean;

global V : SetVert; {множество вершин графа G=(V,E), Card(V)=n }

Adj:  array  [1..n] of ListVert; { списки смежности }

T : SetBr; { множество ветвей (branch) дерева }

begin

for  v  V do  NewVert[v] := True; { - пометить все вершины как необследованные }

Create(q);  q  v0;

NewVert[v0] := False;

T := {};

while

not Null( q )

do

begin 

v  q;

посетить ( v );

for   u  Adj[v]  do

if NewVert[u]  then

begin 

q  u;

NewVert[u] := False;

T := T + { <v,w> }

{ PredVert[u] := v }

end {if-for} { вершина v - использована }

end {while}

end { BFS }

ПОИСК В ГЛУБИНУ

( Depth First Search - DFS )

Q = Stack. Можно сразу рекурсивно.

procedure  DFS ( v: Vert );

global NewVert :  Array [1..n]  of Boolean;

Adj:  array  [1..n]  of  ListVert; { списки смежности }

begin

посетить v;

NewVert[v] := False;

for  u Adj[v]  do

if NewVert[u] then  DFS(u)

{ v - использована }

end  {DFS}

Собственно  поиск в глубину  в графе G=(V,E):

Var V : SetVert; {множество вершин графа G=(V,E), Card(V)=n }

NewVert :  Array  [1..n]  of  Boolean;

begin

for  v  V  do  NewVert[v] := True;

{ - пометить все вершины как необследованные }

for  v  V  do 

if  NewVert[v] then  DFS(v)

end

СВЯЗНЫЕ КОМПОНЕНТЫ

type Num = 0..n;

var  V: SetVert; {множество вершин графа G=(V,E), Card(V)=n }

NumComp :  Array  [1..n]  of  Num; {вершина помечается

номером своей связн.комп-ты }

iC : Num; { номер связной компоненты }

begin

for  v  V  do NumComp[v] := 0;

{ - пометить все вершины как необследованные }

iC := 0;

for  v  V  do 

if  NumComp[v] = 0 then

begin

iC := iC + 1;

Comp(v)

end {if}

end

Рекурсивная процедура нахождения связных компонент

procedure Comp ( v: Vert );

global

NumComp :  Array  [1..n]  of 0 Num;

Adj:  array [1..n]  of  ListVert; { списки смежности }

iC : Num; { номер связной компоненты }

begin

NumComp[v] := iC;

for  u  Adj[v]  do

if  NumComp[u] = 0 then  Comp(u)

{ v - использована }

end  {Comp}

1

Соседние файлы в папке Алгоритмы на графах (на псевдокоде)