Алгоритмы на графах (на псевдокоде) / GRF_TDFS
.docПостроение остовного дерева и множества обратных ребер
при поиске в глубину
( Tree of Depth First Search -TDFS )
procedure TDFS ( v, u: Vert );
{ посещаем вершину v и т.д.; u=Отец(v) }
global
NumVert : Array [1..n] of Nat0n; {Nat0n=0..n}
Adj: array [1..n] of ListVert; { списки смежности }
iV: Nat0n; {текущий порядковый номер посещения вершины}
T : SetBr; { множество ветвей остовного дерева }
B : SetBr; { множество хорд (обратных ребер) }
begin
iV := iV + 1; { посетить v}
NumVert[v] := iV;
for w Adj[v] do
if NumVert[w]=0 then
begin { <v,w> - ребро (ветвь) остовного дерева }
T := T + { <v,> };
TDFS( w, v)
end
else { w - уже посещалась }
if (NumVert[w] < NumVert[v]) & (w<>u)
then { <v,w> - обратное ребро (хорда) }
B := B + { <v,w> }
{fi}
{fi}
{od}
{ v - использована }
end {TDFS};
Собственно поиск в глубину в графе G=(V,E):
var
V : SetVert; {множество вершин графа G=(V,E), Card(V)=n }
NumVert : Array [1..n] of Nat0n; {Nat0n=0..n}
Adj: array [1..n] of ListVert; { списки смежности }
iV: Nat0n; {текущий порядковый номер посещения вершины}
T : SetBr; { множество ветвей остовного дерева }
B : SetBr; { множество хорд (обратных ребер) }
begin
for v V do NumVert[v] := 0;
{ - пометить все вершины как необследованные }
iV := 0;
T := {}; B := {};
for v V do
if NumVert[v]=0 then TDFS(v,v )
end