Задача состоит в нахождении минимального остова графа ... Задаю матрицу смежности ( элементу матрицы a[i,j]:=w, где w - вес ребра) Мне нужно отсортировать рёбра по весу, задача вроде лёгкая, но либо я туплю, либо всё не так просто ...
For i:=1 to n do For j:=1 to n do if Pred a[i,j]< a[i,j] then .....
Хотел использовать пузырьковую сортировку ... Проблема состоит в том что я не знаю как записать предыдущий элемент... Или может как-то по-другому надо поступать?
procedure solve; var sm,sp:set of 1..maxn; min,i,j,l,t:integer; begin min:=maxint; sm:=[1..n];sp:=[]; for i:=1 to n-1 do for j:=i+1 to n do if (a[i,j] < min) and (a[i,j] <> 0) then begin min:=a[i,j]; l:=i;t:=j; end; sp:=[l,t];sm:=sm-[l,t]; write(l,' ',t ,' ');
Ищем ребро минимально веса. Включаем вершины в список минимального остова, и исключаем вершины из списка неокрашенных ...
while sm <> [] do begin min:=maxint; l:=0;t:=0; for i:=1 to n do if not (i in sp) then for j:=1 to n do if (j in sp) and (a[i,j] < min) and (a[i,j] <> 0) then begin min:=a[i,j]; l:=i;t:=j; end; sp:=sp+[l];sm:=sm-[l]; write(l,' ',t,' '); end; end;
Потом находим оставшиеся рёбра остова ... вроде всё так ...
sp - список включенных ребер sm - список оставшихся вершин
Есть еще один вопросик: Можно ли в этот алгоритм как-нибудь вставить стек, очередь или дек? Возможно ли их применение в этом алгоритме?