Skocz do zawartości
ajsi

f grafy i program w paskalu

Rekomendowane odpowiedzi

Mam problem z programem.

Ma on za zadanie generowanie f-grafu z parametrów n-liczba wierzchołków, f-maksymalny stopień wierzchołka i rep-liczba powtórzeń.

Po generacji program ma zliczać składowe spójnośći (czyli czy graf jest w jednym kawałku czy jest w wilu i w ilu dokładnie). Chodzi o to by można było zrobić statystyka dla zadanych parametrów jaki jest rozkład liczby składowych.

 

Oto kod który do tej pory skleciłem:

 

program fmaksgrafy (input, output);

{ //uses;}

 

 

const nmax=10; kmax=nmax*(nmax - 1) div 2;

 

type

ind=1..nmax; ind1=1..kmax;

r=record

a,b:byte;

code:Boolean;

end;

t=array[ind] of integer;

t1=array[ind1] of r;

t2=array[ind,ind] of Boolean;

tx=array[ind] of Boolean;

 

var

E:t1;

A:t2;

n,f,k,total,rep: integer;

g,h,i,j,l,v: integer;

S:t;

{ // wariant:integer; }

{ // h1, m1, s1, ms1:word; }

x:tx;

 

 

 

procedure czyt(var n, f, rep: integer);

begin

write('n, f, rep= ');

readln(n,f,rep);

end; {czyt}

 

 

procedure init (n:integer; var E:t1; var total: integer); {przygotowanie tablicy E}

var i, j, h:integer;

 

begin

h:=0;

 

for i:=1 to n-1 do

for j:=1 to n do

begin

h:=h+1;

with E[h] do begin a:=i; b:=j end;

end;

 

total:=h;

end; {init}

 

 

 

procedure Gnf (n,f,total:integer; var E:t1; var k:integer); {losowanie maksymalnego grafu z zadanym n, f}

var i,h,l,z:integer;

x:r;

c:t;

 

begin

for i:=1 to n do c:=0;

for i:=1 to total do E.code:=false;

h:=0;

for l:=total downto 1 do

begin

z:=random(l)+1;

with E[z] do

if (c[a] < f) and (c < f) then

begin

code:=true; h:=h+1;

c[a]:=c[a]+1; c:=c+1;

end;

x:=E[z];

E[z]:=E[l];

E[l]:=x;

end;

k:=h;

 

end; {Gnf}

 

 

 

procedure transEA (n,total: integer; var E:t1; var A:t2); {tranformacja tablicy E do A}

var

i,j,l:integer;

x: Boolean;

 

begin

for i:=1 to n do A[i,i]:=false;

for l:=total downto 1 do

begin

with E[l] do begin i:=a; j:=b; x:=code end;

A[i,j]:=x; A[j,i]:=x;

end;

end; {transEA}

 

 

procedure skladowa (n,v:integer; var A:t2; var x:tx); {odwiedza kolejnych nie odwiedzonych}

{sasiadow i buduje sciezke}

var j:integer;

 

begin

for j:=1 to n do

if A[v,j] and not x[j] then

begin

x[j]:= true;

skladowa (n,j,A,x);

end;

end;{skladowa}

 

 

procedure test(n,h:integer; var g:integer; var x:tx);

{ var h:integer; }

 

begin

{ for h:=2 to n do }

if (x[h]=false) then {jesli wartosc w x jest rowna 1 przechodzi do kolejnego x z tablicy}

{ h:=h+1

 

else }

begin {jesli w x napotka 0}

g:=g+1; {powieksza licznik skladowych spojnosci}

 

skladowa(n,h,A,x); {wywoluje procedure dla wczesniej}

{ nie odwiedzonego wierzcholka i aktualizuje x}

{ test(n,g,x);} {ponownie jest sprawdzana tablica x,}

{ jesli sa same 1 otrzymujemy g-liczbe skladowych grafu,}

{ jesli jeszcze napotkamy 0 wywolywane jest procedura skladowe}

end;

end;{test}

 

 

 

 

BEGIN

{// repeat }

{// writeln('wariant:(1/2)'); }

 

{// readln (wariant); }

{// case wariant of }

{// 1.begin { wariant 1 buduje tablice s w funkcji n }

 

czyt(n,f,rep);

init(n,E,total);

for l:=1 to n do s[l]:=0; {zerowanie tablicy z iloscia skladowych}

 

for i:=1 to rep do

begin

 

Gnf(n,f,total,E,k); {losuje maksymalny fgraf o zadanym n i f}

transEA (n,total,E,A); {transformuje tablice E do A}

 

g:=1;

for j:=1 to n do x[j]:=false; {inicjalizuje tablice odwiedzonych wierzcholkow}

x[1]:=true; {ustawia 1 jako odwiedzony}

skladowa(n,1,A,x); {sprawdza kolejnych sasiadow i aktualizuje x}

 

for h:=1 to n do

begin

test(n,h,g,x); {sprawdza tablice x }

end; {i dla 0 buduje sciezke od tego wierzcholka}

{ do kolejnych sasiadow po czym aktualizuje x }

{ i wywoluje siebie sama}

s[g]:=s[g]+1; {aktualizuje tablice spojnosci}

{tablica zlicza grafy dla odpowiedniej liczby skladowych}

 

end ;

for k:=1 to n do

 

writeln('dla s=',k,':',s[k]) ;

readln;

 

{end; }

 

 

{ 2.begin wariant 2 bedzie sprawdzal zlorzomosc czasowa}

 

END.

 

 

 

 

Problem polega na tym że program się kompiluje ale nie liczy tego co powinien. Wyniki są błędne ale powtarzalne. To mój pierwszy większy program w pascalu i już nie wiem co jest skopane.

Jeśli ktoś miał coś podobnego albo ma pojęcie o pascalu i grafach to bardzo bym prosił o pomoc.

Jeśli ktoś ma jakieś pytania albo coś niejasne to niech pisze.

Sorki za przydługawy post ale kod wrzuciłem cały:)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hej, szkoda że nikomu nie chciało się pomóc:(

Niemniej błąd znalazłem sam i jak to zwykle bywa nie tam gdzie go szukałem. Niepoprawna jest procedura init, to dla tych co potrzebowali by ściągi z fgrafów, jak ktoś chce szczegóły to na priva:)

Moderatorzy mogą zamknąć ten topic.

Dziękiuję za uwagę i pozdrowienia dla wszystkich to czytających:)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...