![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Нахождение Эйлерового цикла выполняется по алгоритму Флёри. 
		
	
		
		
		
		
		
		
			Допустим граф задаётся следующей матрицей смежности ![]() Начало цикла пускай будет в вершине 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;
 Но при выполнении могут пройтись не все рёбра,т.к. выбирается случайная вершина . ![]() ЗЫ Пока писал,вспомнил,что вершина выбирается случайно,но "мост" выбирается,если нет других вариантов.Подскажите,как модифицировать,что бы учитывалось это? ЗЫЫ Могу скинуть всю программу того,что есть на данный момент. Последний раз редактировалось too lame, 17.12.2011 в 18:05.  |