![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 21.12.2010
Сообщений: 4
|
![]()
Задание: построение Эйлерова цикла в неориентированном графе.
Проблема: процедуру Эйлерова цикла нам дали готовую (она перечисляет вершины), вот только не получается графически на экране изобразить преобразованный граф. Program Lab; Uses Crt,Graph; const Qt = 20; var st : string; k1 : integer; {-------------------------- Begin Stack -------------------------------} const NL = 1000; Type Number = 0..NL; Type Stack = object Elements: array [1..NL] of integer; Last: Number; Constructor Init; Function Push (Dn : integer) : boolean; Function Empty : boolean; Function Pop (var Dn:integer): boolean; Procedure Print; end; Constructor Stack.Init; begin Last:=0; end; Function Stack.Push(Dn : integer): boolean; begin If Last < NL then begin Inc(Last); Elements[Last] := Dn; Push := true; end else Push := false; end; Function Stack.Empty : boolean; begin If Last = 0 then Empty := TRuE else Empty := false; end; Function Stack.Pop (var Dn : integer): boolean; var I : Number; begin If Empty then Pop := false else begin Dn := Elements[Last]; Dec(Last); Pop := true; end; end; Procedure Stack.Print; var I : Number; begin For I := 1 to Last do write(Elements[I]:3); writeln; end; {----------------------------- Begin Graf -----------------------------} const MaxVertex = 100; MaxEdges = 500; x0 = 320; y0 = 240; R = 200; Type Edge = record From, Into : integer; end; Graf = object KolVertex : 0..MaxVertex; KolEdges : 0..MaxEdges; Edges:array [1..MaxEdges] of Edge; Used: array [1..MaxVertex] of boolean; Numbers: array [1..MaxVertex] of integer; coordX: array [1..MaxVertex] of integer; coordY: array [1..MaxVertex] of integer; Constructor Init(KV, KE : integer); Function Get(var s : string) : string; Procedure Print; {VbIvod grafa na ekran} end; Constructor Graf.Init(KV, KE : integer); var i : integer; begin KolVertex := KV; KolEdges := KE; For i := 1 to KolVertex do begin Used[i] := false; Numbers[i] := MaxInt; coordX[i] := round(x0 + R*cos(2*pi*(i-1)/KolVertex)); coordY[i] := round(y0 - R*sin(2*pi*(i-1)/KolVertex)); end; end; Function Graf.Get(var s : string) : string; begin Get := s; end; Procedure Graf.Print; var i, j, rad, rad1, vert, x1, y1, grDriver, grMode : integer; f : boolean; s : string; const x0 = 460; y0 = 80; dins = 20; begin rad := 5; rad1 := 8; grDriver := Detect; InitGraph(grDriver, grMode, ''); SetColor(15); For i := 1 to KolVertex do begin Circle(coordX[i], coordY[i], rad); str(i, s); SetColor(Yellow); OutTextXY(coordX[i] + round(13*cos(2*pi*(i-1)/KolVertex)), coordY[i] - round(13*sin(2*pi*(i-1)/KolVertex)), s); SetColor(15); end; For i := 1 to KolEdges do For j := 1 to KolVertex do begin f := true; If Edges[i].From = j then vert := Edges[i].Into else If Edges[i].Into = j then vert := Edges[i].From else f := false; If f then begin SetColor(9); Line(coordX[j], coordY[j], coordX[vert], coordY[vert]); end; SetColor(15); end; readln; CloseGraph; end; {--------------------------------------------------------------------------} var Gra : Graf; Function Another(NE, First : integer; var Second : integer) : boolean; begin Another := true; with Gra.Edges[NE] do begin If From = First then Second := Into else If Into = First then Second := From else Another := false; end; end; Procedure DeleteEdge(Number : integer); var i : integer; begin with Gra do begin dec(KolEdges); For i := Number to KolEdges do Edges[i] := Edges[i + 1]; end; end; Function Euler(var Sta : Stack) : boolean; Function SearchEdge(var Vertex, NumberEdge : integer) : boolean; var I : integer; begin with Gra do begin SearchEdge := true; For I := 1 to KolEdges do If Another(I, Vertex, Vertex) then begin NumberEdge := I; exit; end; SearchEdge := false; end; end; |
![]() |
![]() |
![]() |
#2 |
Регистрация: 21.12.2010
Сообщений: 4
|
![]()
var Sta1 : Stack;
Vertex, NumberEdge: integer; s : string; begin Euler := false; Sta.Init; Sta1.Init; Vertex := Gra.Edges[1].From; write(Gra.Edges[1].Into); While Gra.KolEdges > 0 do If SearchEdge(Vertex, NumberEdge) then begin Sta.Push(Vertex); DeleteEdge(NumberEdge); end else If Sta.Pop(Vertex) then Sta1.Push(Vertex) else exit; While Sta1.Pop(Vertex) do Sta.Push(Vertex); Euler := true; end; const Root = 4; MS1 : array[1..6,1..6] of integer= ((1,0,1,0,0,1), (0,1,0,0,0,0), (0,0,1,0,0,0), (0,1,0,1,0,1), (0,0,0,1,1,0), (1,0,0,0,1,0)); var i, j, k, t : integer; sta1 : Stack; BEGIN with Gra do {Вот здесь рисую граф ДО преобразования} begin Init(6, 6); k := 1; for i := 1 to 6 do for j := 1 to 5 do for t := j + 1 to 6 do begin if (MS1[j,i] = 1) and (MS1[t,i] = 1) then begin Edges[i].From := j; Edges[i].Into := t; Used[j] := true; Used[t] := true; Inc(k); break; end; end; Print; end; {Gra.Init(6, 6); Здесь надо нарисовать граф ПОСЛЕ построения ЭЦ} sta1.Pop(i); t := 1; while not sta1.Empty do begin sta1.Pop(j); with Gra do begin Edges[t].From := i; Edges[t].Into := j; writeln(i, ' ',j); readln; Used[i] := true; Used[j] := true; end; i := j; inc(t); end;} write('Euler cycle: '); {Отладочная инфа - простой вывод списка вершин} Euler(sta1); sta1.print; readln; {Gra.Print;} END. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с STL. Поиск эйлерова цикла на графе | litviak | Общие вопросы C/C++ | 2 | 14.04.2012 10:45 |
алгоритмы нахождения эйлерова цикла и гамильтонова цикла в графе. | Necare | Помощь студентам | 0 | 15.11.2011 18:26 |
Построение цикла | Sensizu | Общие вопросы Delphi | 3 | 18.06.2010 15:56 |
Поиск Эйлерова цикла в графе | Danion | Помощь студентам | 3 | 22.05.2010 18:47 |
Нахождение эйлерова цикла, косяк | vendigo | Общие вопросы C/C++ | 1 | 22.11.2007 14:14 |