Алгоритмы на графах (на псевдокоде) / ПОИСК ПО ГРАФУ
.docПОИСК ПО ГРАФУ
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}