GR Eulerian

You might also like

You are on page 1of 2

program verif_graf_eulerian;

var eulerian:boolean;
e,gr,c,c1:array[1..20] of integer;
a:array[1..20,1..20] of integer;
n,m,i,j,k,k1,x,y,l:integer;
viz:array[1..20] of byte;
function vf_iz :boolean; {val este true daca graful are vf izolate}
var i,j,s:byte;
begin
vf_iz:=false;
for i:=1 to n do
begin
s:=0;
for j:=1 to n do s:=s+a[i,j];
gr[i]:=s;
if s=0 then
begin
vf_iz:=true;
break;
end;
end;
end;
function grade_pare:boolean; {are val true daca gradele tuturo}
var i:byte;
{ varfurilor sunt numere pare}
begin
grade_pare:=true;
for i:=1 to n do
if odd(gr[i]) then
begin
grade_pare:=false;
break
end;
end;
function conex:boolean; {are val true daca graful este conex}
var b,viz:array[1..20] of byte;
i,j,p,u,v:byte;
begin
for j:=1 to n do viz[j]:=0;
b[1]:=1;
p:=1;u:=1;viz[1]:=1;
while p<=u do
begin
v:=b[p];
for j:=1 to n do
if (a[v,j]=1) and (viz[j]=0) then
begin
u:=u+1;
b[u]:=j;
viz[j]:=1
end;
p:=p+1;
end;
conex:=true;
for i:=1 to n do
if viz[i]=0 then
begin
conex:=false;
break;
end;
end;

Begin
write('n,m=');readln(n,m);
for i:=1 to n do
for j:=1 to n do a[i,j]:=0;
writeln('dati muchiile grafului: ');
for i:=1 to m do
begin
write('mucjia ',i,'=');readln(x,y);
a[x,y]:=1;a[y,x]:=1;
end;
eulerian:=not vf_iz and grade_pare and conex;
if not eulerian then writeln('graful nu este eulerian')
else
begin
{se construieste in C primul ciclu}
writeln('graful este eulerian');
c[1]:=1;
k:=1;
repeat
for j:=1 to n do
if a[c[k],j]=1 then
begin
k:=k+1;
c[k]:=j;
a[c[k-1],j]:=0 ;
a[j,c[k-1]]:=0;
gr[j]:=gr[j]-1;
gr[c1[k1-1]]:=gr[c1[k1-1]]-1;
break;
end;
until c1[k1]=c1[1];
for j:=k downto l do c[j+k1-1]:=c[j];{se depl elem in C}
for j:=1 to k1-1 do c[j+l]:=c1[j+1];
k:=k+k1-1;
end;
writeln('ciclu eulerian: ');
for i:=1 to m+1 do write(' ',c[i]);
readln
end.

You might also like