Об алгоритмической реализации теоремы Менгера 3

Dec (k);

·  Во-вторых, нам при формировании цепи не имеет смысла заходить в вершины, валентность которых равна 1. В <u,v>-цепях такие вершины являются лишними.

Решение: перед тем как пойти к какой-либо вершине, мы проверяем ее валентность. И если валентность вершины равна 1, то пропускаем ее.

If Val_V[i]<>1 then begin … end;

·  В-третьих, например, идя из вершины 3 в вершину 5, нужно исключить возможность формирования вершинно-пересекающихся цепей 3-1-4-5 и 3-1-10-5.

Решение: как только была найдена нужная нам вершина, мы должны вернуться к исходной вершине и продолжить поиск, но уже по другому ребру. Для этого вводим специальную логическую переменную pp, которая будет отвечать за нахождение вершины.

Изначально pp:=false, как только нашли вершину v,
pp:=true. Далее идем назад, пока не встретим снова вершину u. Нашли ее, pp:=false, и снова продолжаем поиск и формирование <u,v>-цепи.

После внесенных изменений процедура Solve будет выглядеть так:

Procedure Solve;

var B:boolmas;

Num:mas;

u,v,t,ways:integer;

pp:boolean;

Procedure Search (i:integer; var k:integer);

var j:integer;

begin

Num[k]:=i;

B[i]:=True;

j:=0;

if A[i,v]=1 then begin

pp:=true;

Print(num,k);

inc(ways);

FillChar (Num,Sizeof(Num),0);

end

else

while (j<N) and not pp do begin

inc(j);

if (A[i,j]=1) and (B[j]=false) then

if Val_V[i]<>1 then begin

inc(k);

Search(j,k);

end;

end;

dec (k);

if k=1 then pp:=false;

end;

begin

for u:=1 to N-1 do

for v:=u+1 to N do begin

write (u,’ – ‘,v);

if A[u,v]=1 then writeln (‘  смежные’)

else if (Val_V[u]=1) or (Val_V[v]=1) then writeln (‘  1′)

else begin

pp:=false;    t:=1;    ways:=0;

FillChar (B,Sizeof(B),0);

Search (u,t);

writeln (‘ways:  ‘,ways);

end;

end;

end;

Похожие записи

Добавить комментарий