Скачиваний:
12
Добавлен:
01.05.2014
Размер:
24.06 Кб
Скачать

Нахождение сильно связных компонент графа (ССК)

(на основе поиска в глубину) - 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

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