Ocena użytkownikóww: ***** / 2
Nadesłany przez Tomasz Lubiński, 31 lipca 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
euler/graf.pas:
//Tomasz Lubiński (c)2001
//www.algorytm.org
unit graf;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure GenerujClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Macierz: Array of Array of SmallInt;
n, licznik: Integer;
implementation
{$R *.DFM}
//generowanie grafu - macierz dolnotrójkątna
procedure TForm1.GenerujClick(Sender: TObject);
var b,i,j,wierzcholek : Integer;
begin
Finalize(Macierz);
n:=StrToInt(edit1.text); //liczba wierzcholkow
b:=StrToInt(edit2.text); //stopien nasycenia grafu w %
//tworzenie macierzy dolnotrójkątnej dynamicznej
SetLength(Macierz, n+1);
for i:=0 to n do
SetLength(Macierz[i], i);
//wyczysc graf
//Macierz[i, j] = 0 - oznacza brak krawedzi pomiedzy wierzcholkami i oraz j
//Macierz[i, j] = 1 - oznacza krawedz pomiedzy wierzcholkami i oraz j
for i:=0 to n do
for j:=0 to i-1 do
Macierz[i, j] := 0;
//utworz graf o zadanym nasyceniu
randomize;
for i:=2 to n do
for j:=1 to i-1 do
if random(100)<b then Macierz[i,j]:=1; //ustawienie stopnia nasycenia
//modyfikacja grafu tak by istnial cykl EULERA
for wierzcholek:=1 to n-1 do //parzystosc wierzcholkow
begin
//oblicz stopien wierzcholka
i:=0;
for j:=1 to wierzcholek-1 do
if macierz[wierzcholek, j]>0 then i:=i+1;
for j:=wierzcholek+1 to n do
if macierz[j, wierzcholek]>0 then i:=i+1;
//jezeli stopien wierzcholka nie jest parzysty
if (i mod 2) <> 0 then
begin
i:=Random(n-wierzcholek)+wierzcholek+1;
if macierz[i, wierzcholek]>0 then
macierz[i, wierzcholek]:=0
else
macierz[i, wierzcholek]:=1;
end;
end;
end;
end.