Алгоритмы на графах (на псевдокоде) / GR_STRNG
.docНахождение сильно связных компонент графа (ССК)
(на основе поиска в глубину) - Strong Connection
procedure STRONG ( v: Vert );
global
NumVert : Array [1..n] of Nat0n; {Nat0n=0..n}
Adj: array [1..n] of ListVert; { списки смежности }
iV: Nat0n; {текущий порядковый номер посещения вершины}
LowLink: Array [1..n] of Nat0n;
St: Stack of V; {стек для записи вершин}
begin
iV := iV + 1; { посетить v}
NumVert[v] := iV; LowLink[v] := NumVert[v];
St v;
for w Adj[v] do
if NumVert[w]=0 then
begin { <v,w> - ребро (ветвь) остовного дерева }
STRONG ( w );
LowLink[v] := min (LowLink[v],LowLink[w]);
end
else { w - уже посещалась }
if (NumVert[w] < NumVert[v]) then
{ <v,w> - обратное или поперечное ребро }
if w St then
{w находится в той же ССК, что и v, поскольку
w Adj[v] и w St означает, что существует путь из w в v}
LowLink[v] := min ( LowLink[v],NumVert[w] )
{fi}
{fi}
{od}; { v - использована }
if LowLink[v] = NumVert[v] then { v - корень ССК }
while x с вершины стека St удовлетворяет соотношению (NumVert[x] >= NumVert[v]) do
begin
добавить x к текущей ССК;
исключить x из St
end
{fi}
end {STRONG};
Главная программа нахождения сильно связных компонент графа 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; {текущий порядковый номер посещения вершины}
LowLink: Array [1..n] of Nat0n;
St: Stack of V; {стек для записи вершин}
begin
for v V do NumVert[v] := 0;
{ - пометить все вершины как необследованные }
iV := 0; Empty(St);
for v V do
if NumVert[v]=0 then STRONG (v)
end