Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Листинги.docx
Скачиваний:
5
Добавлен:
09.08.2019
Размер:
38.72 Кб
Скачать

Обход ориентированных и неориентированных графов.

Листинг 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 }