
Обход ориентированных и неориентированных графов.
Листинг 7.4 Алгоритм поиска в ширину
procedure bfs(v);
{bfs обходит все вершины, достижимые из вершины v}
var
Q: QUEUE {очередь для вершин}
x, y: вершина;
begin
mark[v]:=visited; writeln (v);
ENQUEUE(v,Q);
while not EMPTY(Q) do begin
x:=FRONT(Q);
DEQUEUE(Q);
for для каждой вершины y, смежной с вершиной x do
if mark[y]=unvisited then begin
mark[y]:=visited; writeln(y);
ENQUEUE(y,Q);
INSERT((x,y),T)
end
end
end; {bfs}
Листинг Алгоритм поиска в глубину
procedure dfs(v);
{dfs обходит все вершины, достижимые из вершины v}
var
S: STACK {стек для вершин}
x, y: вершина;
begin
mark[v]:=visited; writeln (v);
PUSH(v,S);
while not EMPTY(S) do begin
x:=TOP(S);
POP(S);
for для каждой вершины y, смежной с вершиной x do
if mark[y]=unvisited then begin
mark[y]:=visited; writeln(y);
PUSH(y,Q);
INSERT((x,y),T)
end
end
end; {bfs}
Остовные деревья минимальной стоимости.
Листинг 7.1. Алгоритм Прима (эскиз)
procedure Prim ( G: граф; var T: множество ребер );
var
U: множество вершин;
u, v: вершина;
begin
T:= ø;
U:= {1};
while U≠V do begin
нахождение ребра (u, v) наименьшей стоимости и такого,
что uєU и v є V\U;
Т:= Т {(u, v)};
U:= U {v}
end
end; { Prim }
Листинг 7.2. Программа выполнения алгоритма Прима
procedure Prim ( С: аггау [1..n, 1..n] of real );
{ Prim печатает ребра остовного дерева минимальной стоимости
для графа с вершинами {1, ..., n} и матрицей стоимости С}
var
LOWCOST: array[1..n] of real;
CLOSEST: array[1..n] of integer;
i, j, k, min: integer;
{ i и j — индексы. При просмотре массива LOWCOST
к — номер найденной вершины, min = LOWCOST[k] }
begin
for i:= 2 to n do begin
{ первоначально в множестве U только вершина 1 }
LOWCOST[i]:= С[1, i];
CLOSEST[i]:= 1
end;
for i:= 2 to n do begin
{ поиск вне множества U наилучшей вершины к, имеющей
инцидентное ребро, оканчивающееся в множестве U }
min:= LOWCOST[2];
к:= 2;
for j:= 3 to n do
if LOWCOST[j] < min then begin
min:= LOWCOST[j];
k:= j
end;
writeln {k, CLOSEST[k]); { вывод ребра на печать }
LOWCOST[k] -.= infinity; { к добавляется в множество U }
for j:= 2 to n do { корректировка стоимостей в U }
if {C[k, j] < LOWCOST[j]) and {LOWCOST[j] < infinity) then begin
LOWCOST[j]:= C[k, j];
CLOSEST[j]:= к
end
end
end; { Prim }
Листинг 7.3. Программа (эскиз), реализующая алгоритм Крускала
procedure Kruskal ( V: SET; Е: SET; var T: SET );
{ V — множество вершин, Е и Т — множества дуг }
var
ncomp: integer; { текущее количество компонент }
edges: PRIORITYQUEUE;
{множество дуг, реализованное как очередь с приоритетами}
components: MFSET;
{ множество V, сгруппированное в множество компонент }
u, v: вершина;
е: ребро;
nextcomp: integer; { имя (номер) новой компоненты }
ucomp, vcomp: integer; { имена (номера) компонент }
begin
MAKENULL(Т) ;
MAKENULL(edges) ;
nextcomp:= 0;
ncomp:= число элементов множества V;
for v ∈ V do begin { инициализация компонент,
содержащих по одной вершине из V }
nextcomp:= nextcomp + 1;
INITIAL(nextcomp, v, components)
end;
for e ∈ E do { инициализация очереди с приоритетами,
содержащей ребра }
INSERT(e, edges);
while ncomp > 1 do begin { рассматривается следующее ребро }
е:= DELETEMIN(edges) ;
пусть е = (u, v);
ucomp:= FIND(u, components);
vcomp:= FIND(v, components);
if ucomp <> vcomp then begin
{ ребро е соединяет две различные компоненты }
MERGE(ucomp, vcorap, components);
ncomp:= ncomp - 1;
INSERT(e, T)
end
end
end; { Kruskal }