Показать сообщение отдельно
  #1  
Старый 17.12.2011, 18:03
too lame too lame вне форума
Прохожий
 
Регистрация: 17.12.2011
Сообщения: 3
Репутация: 10
По умолчанию Нахождение Эйлерового цикла (Графы)

Нахождение Эйлерового цикла выполняется по алгоритму Флёри.
Допустим граф задаётся следующей матрицей смежности

Начало цикла пускай будет в вершине 1. Для наглядности граф :


Так вот при проходе мы выбираем любую вершину.Вот код нахождения
Код:
Function GetRandom (var WorkMatrix:SWorkMatrix;var row:integer):integer;
var j,i:integer; Vershini_s_1:array[0..9] of integer;
begin
 j:=0;
 randomize;
 for i:=1 to 10 do
  if WorkMatrix[i,row]=1 then
    begin
     Vershini_s_1[j]:=i;
     inc(j);
    end;
 if j=0 then result:=0 else
 result:=Vershini_s_1[random(j-1)];
end;

И собственно сам алгоритм :
Код:
tek_vershina:=start;
  buffer:=getrandom(WorkMatrix,tek_vershina);//получаем случайное ребро
  WorkMatrix[buffer,tek_vershina]:=0;
  WorkMatrix[tek_vershina,buffer]:=0; //удаляем пройденное ребро
  tek_vershina:=buffer;// изменяем текущую вершину
  cycle:=inttostr(start)+'->'+inttostr(tek_vershina); //формируем цикл
    while (getrandom(WorkMatrix,tek_vershina) <> 0)and(tek_vershina <> start) do
    begin
        buffer:=getrandom(WorkMatrix,tek_vershina);
        WorkMatrix[buffer,tek_vershina]:=0;
        WorkMatrix[tek_vershina,buffer]:=0;
        cycle:=cycle+'->'+inttostr(buffer);
        tek_vershina:=buffer;
    end;
 

Но при выполнении могут пройтись не все рёбра,т.к. выбирается случайная вершина .


ЗЫ Пока писал,вспомнил,что вершина выбирается случайно,но "мост" выбирается,если нет других вариантов.Подскажите,как модифицировать,что бы учитывалось это?

ЗЫЫ Могу скинуть всю программу того,что есть на данный момент.
Ответить с цитированием