Documente Academic
Documente Profesional
Documente Cultură
ATESTAT PROFESIONAL
Prof.ndrumtor:
Sceanu Ion
Elev:Vlsan Alina Corina
Profil:Matematica-Informatic
Colegiul Tehnic Mtsari
2015
1
DRUMURI N GRAFURI
ORIENTATE
Prof.ndrumtor:
Sceanu Ion
Elev:Vlsan Alina Corina
Profil:Matematica-Informatic
Colegiul Tehnic Mtsari
2015
2
CUPRINS
Argument.
4
Grafuri orientate ..............................................5
Drumuri minime i maxime n grafuri orientate..........7
Altgoritmul lui Dijkstra...........................................9
Altgoritmul lui Roy-Floid..................................13
Drumuri maxime n grafuri orientate.........................17
Grafuri euleriene.....................................................20
Grafuri hamiltoniene........................................25
Bibliografie.....................................................27
Argument
3
Grafuri orientate
Noiuni de baz
u5
u1
1
u3
u4
u7
u2
3
u6
unde YX, iar arcele din V sunt toate arcele din U care au ambele extremiti n
mulimea de vrfuri Y.
Deci un subgraf H al unui graf orientat G este graful G nsui sau se
obine din G prin suprimarea anumitor vrfuri i a tuturor arcelor incidente cu
acestea .
Vom spune c subgraful H este indus sau generat de mulimea de vrfuri
Y.
Astfel,subgraful grafului G din figura ,indus de mulimea de vrfuri Y1
={1,2,4,5} are ca mulime de arce mulimea V 1 ={(1,2), (2,4), (4,5)},iar
subgraful indus de mulimea de vrfuri Y2 ={6,7,8} are mulimea arcelor
V2={(7,6),(6,8),(7,8),(8,7)}.
Un graf orientat este complet dac oricare dou vrfuri sunt adiacente.
n timp ce n cazul neorientat un graf complet cu n vrfuri este unic
determinat, n cazul orientat exista mai multe grafuri complete cu un numr dat
de vrfuri.Ele se deosebesc fie prin orientarea arcelor , fie prin faptul c ntre
dou vrfuri oarecare exista un arc sau dou arce de sensuri contrare.
Un lan al unui graf orientat se definete ca un ir de arce:
L=[u1,u2,..,up]
Cu proprietatea c oricare arc uI din acest ir are comun o extremitate cu ui-1 ,
iar cealalt extremitate este comun cu ui+1 pentru orice i=1,...,p-1.
Dac toate arcele lanului L au aceeai orientare ,care este dat de sensul
deplasrii de la x0 ctre xr lanul se numete drum.
Deci un drum ntr-un graf orientat G=(X,U) este un ir de vrfuri notat :
D=(x0,x1,...,xr)
cu proprietatea c (x0,x1), (x1,x2), .... , (xr-1,xr)U, deci sunt arce ale grafului.
Vrfurile x0 i xr se numesc extremitile drumului D. Dac vrfurile
x0 ,x1 , ... , xr sunt distincte dou cte dou, drumul D se numete elementar. Din
aceste definiii rezult c orice drum este i lan , dac l privim ca un ir de
arce.
Un drum D=(x0, ... ,xr) poate fi interpretat ca fiind traseul unei daplasari
pe arcele grafului n ordinea (x0,x1), (x1,x2), ... , (xr-1,xr).
De aceea drumul D de extremiti x0 i xr , se mai spune c este un drum
de la x0 la xr .Dac x0=xr i toate arcele (x0,x1), (x1,x2), ... ,(xr-1,xr) sunt distincte
dou cte dou, drumul D se numete circuit.
Dac toate vrfurile circuitului, cu excepia primului i a ultimului vrf,
sunt distincte dou cte dou, circuitul se numete elementar.
Noiunile de conexitate i de componenta conexa a unui graf orientat sunt
similare cu cele de la grafurile neorientate , utiliznd noiunea de lan din cazul
grafurilor orientate.
6
daca i=j
+
daca (xi ,xj)U
Intuitiv,aceast alegere ar nsemna c drumul cel mai scurt de la xi la el
nsui este de lungime 0 iar inexistenta arcului ( xi, xj )este totuna cu existena
unui arc de lungime infinit ( care evident nu va interveni niciodat ntr-un
eventual drum minim de la xi la xj ) .
3
1
2
5
3
1
3
6
Se pornete de la vrful xi0 . Evident cel mai scurt drum de la xi0 la unul dintre
celelalte vrfuri ale grafului este dat de arcul (xi0 , xj) de lungime minim .
Urmtorul drum n ordinea lungimilor va fi dat fie de un alt arc cu extremitatea
iniial xi0 fie de un drum (xi0 ,xj ,xp). Alegem n continuare drumuri n ordinea
cresctoare a lungimilor , pn cnd am determinat drumuri minime de la xi0
ctre toate vrfurile pentru care exist drum pornind din xi0.
Pentru aceasta se considera S mulimea vrfurilor xjX pentru care am gsit
drum minim de la xi0 la xj. Iniial S={ xi0 }. La fiecare pas , adugm n S acel
nod xkX \S cu proprietatea c drumul minim de la xi0 la xk are cel mai mic cost
dintre toate drumurile de la xi0 la xp , cu xpX\S.
Pentru exemplul considerat S va avea pe rnd urmtorul coninut:
S={1}
S={1,2}
S={1,2,5}
S={1,2,5,3}
S={1,2,5,3,4}
0 daca xiS
1 daca xiS
const nmax=15;
inf=maxint div 2;
var c:array[1..nmax , 1..nmax] of integer;
k,i,j,arc,m,n,x,y,z,xp: intrger;
s,d,prec:array[1..nmax] of integer
g: boolean;
procedure min(var k: integer);
var m,i: integer;
begin
m:=inf*2;
for i:=1 to n do
if (s[i]=0) and (d[i]<m) then
begin m:=d[i];
k:=i;
end
end;
procedure drum(i:integer);
begin
if i<>0 then
begin
drum(prec[i]);
write(i);
end
else writeln
end;
begin
writeln( dati nr de noduri ); readln (n);
for i:=1 to n do
forj:=1 to n do c[i,j]:=inf;
for i:=1 to n do c[i,j]:=0;
writeln ( dati nr de arce ); read (arc);
for i:=1 to arc do
begin
write ( dati arcul ,i, si lungimea );
readln (x,y,z);
c[x,y]:=z;
end;
read(xp);
for i:=1 to n do begin
d[i]:=c[xp,i];
11
s[i]:=0;
if c[xp,i]< inf then prec[i]:=xp
else prec[i]:=0;
end;
s[xp]:=1;
prec[xp]:=0;
g:=true;
x:=0;
repeat
min(k);
x:=x+1;
if (d[k]=inf) or (x=n) then g:=false
else begin
s[k]:=1;
for j:=1 to n do
if (s[j]=0)and (d[j]>d[k]+c[k,j]) then
begin
d[j]:=d[k]+c[k,j];
prec[j]:=k;
end;
end;
until (not g);
for i:= 1 to n do
if i<>xp then
if d[i]=inf then
begin
write(Nu exista drum de la ,xp, la,i);
writeln;
end
else begin
writeln(Drum minim de la ,xp,la,i);
drum(i);
writeln
end
end.
12
CIJ =
dac i=j
lungimea drumului minim de la xi la xj dac exist
drum de la xi la xj
dac nu exist drum de la xi la xj
Determinarea mtricii C este asemntoare algoritmului Roy-Warshall
pentru obinerea mtricii drumurilor
Se pornete de la matricea costurilor C
for k=1 to n
for i=1 to n (ik)
for j=1 to n (jk)
cij : = min (cij , cik + ckj)
endfor
endfor
endfor
Observaie : Acest algoritm poate fi privit ca o succesiune de n
transformri aplicate mtricii C , o transformare k fiind astfel :
Tk(A) = B, B =(bij)nn , bij= min(aij ,aik+a) i,j { 1 , ... , n}.
Simultan cu determinarea lungimilor minime ale drumurilor , pot fi
reinute i acestea . Vom folosi o matrice D=(dij)nn ale crei elemente dij sunt
mulimi de noduri (dij va reprezenta n final mulimea nodurilor ce pot precede
pe xj n drumul minim de la xi la xj).
Odat cu iniializarea mtricii C cu matricea costurilor vom iniializa i
matricea D astfel :
{xi} daca cij si i j
dij=
13
program roymin;
const nmax=20;
inf=maxint div 2;
{inf poate fi initializat cu o valoare ce depaseste suma tuturor
costurilor}
type multime = set of 1.. nmax;
var c= array[1..nmax , 1..nmax] of word;
{c initial matricea drumurilor}
d: array [1..nmax , 1..nmax] of multime;
dr: array [1..nmax] of 1..nmax;
n,m,i,j.k.lg:word;
procedure initc;
{initializeaza matricea costurilor C}
var i,j,x,y,z: word;
begin
write(` Dati nr de noduri: `);
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
c[i,j] := inf;
c[i,i] :=0;
end;
write(`Dati nr de noduri : `);
readln(m);
for i:=1 to m do
begin
14
begin
writeln:
if c[i,j]=inf then
writeln( nu exista drumuri minime de la ,i, la ,j,)
else
begin
writeln( lungimea drumurilor minime de la ,i, la,j, este
,c[i,j]);
if i<> i then begin
lg:=1;
dr[1]:=j
drum(i,j)
end
end
end
end;
begin
initc;
initd;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if c[i,j]>c[i,k]+c[k,j] then
begin
c[i,j]:=c[i,k]+c[k,j]:
d[i,j]:=d[k,j]
end
else
if c[i,j]=c[i,k]+c[k,j] then
d[i,j]:=d[i,j]+d[k,j];
afiare;
end.
16
-
0
for k=1 to n
for i=1 to n (ki)
for j=1 to n (kj)
if mij<mik+mkj
then mij := mik+mkj
dij := dkj
else
if mij := mik+ mkj
then dij:= dij dkj
endif
endif
endfor
endfor
17
endfor.
n matricea M vom avea n final lungimile drumurilor maxime ntre
oricare 2 noduri iar n dij i ,j{1 , ... , n} vom avea mulimea nodurilor ce pot
precede pe xj ntr-un drum maxim de la xi la xj.
Mai jos este dat programul Pascal de determinare a tuturor drumurilor
maxime ntre oricare dou noduri folosind algoritmul prezentat anterior , pentru
un graf G=(X, U) , X={1 , ... , n} .
program roymax;
const nmax=20;
inf=-(maxint div 2);
type multime = set of 1 .. nmax;
var c: array [1 .. nmax , 1 .. nmax] of integer;
{c initial matricea costurilor}
d: array [1 .. nmax , 1 .. nmax] of multime;
dr: array[1 .. nmax] of 1 .. nmax;
n,m,i,j,k,lg:word;
procedure initc;
{initializeaza matricea costurilor C}
var i,j,x,y,z:word;
begin
write(Dati nr de noduri:);
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
c[i,j]:= inf;
c[i,j]:=0
end;
write(Dati nr de ace :);
readln(m);
for i:=1 to m do
begin
write(Extremitatile si lungimea arcului,i, :);
readln(x,y,z);
c[x,y] :=z;
end
end;
procedure initd ; {initializeaza matricea D}
var i,j : integer ;
begin
18
for i:=1 to n do
for j:=1 to n do
if (c[i,j]> inf) and (i<>j) then d[i,j]:=[i]
else d[i,j]:=[];
end;
prodcedure drum(i,j:integer);
var k:word;
begin
if i<>j then
begin
for k:=1 to n do
if k in d[i,j] then
begin
lg:= lg+1;
dr[lg]:=k;
drum(i,k),
lg:=lg-1
end;
end
else begin
writeln;
for k:=lg downto 1 do
write(dr[k]:4)
end;
end;
procedure afisare;
var i,j:word;
begin
for i:=1 to n do
for j:=1 to n do
begin
writeln;
if c[i,j]=inf then
writeln( nu exista drum intre ,i, si ,j)
else
begin
writeln(Lungimea drumurilor maxime de la,i,la,j, este
,c[i,j]);
if i<>j then begin
lg:=1;
dr[1]:=j;
drum(i,j)
end
19
end
Figura 1.
end
end;
begin
initc;
initd;
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (c[i,k]<>inf) and (c[k,j]<>inf) then
if (c[i,j]<c[i,k]+c[k,j] ) then
begin
c[i,j]:=c[i,k]+c[k,j];
d[i,j]:=d[k,j];
end
else
if c[i,j]=c[i,k]+c[k,j] then d[i,j]:=d[i,j]+d[k,j];
afisare;
end.
Grafuri euleriene
Adeseori suntem tentai s credem simplul fapt de a traversa strzi sau poduri
nu implic nici o idee deosebit. Iat ns c exist o celebr problem de
traversare n care singura idee implicat este aceea de traversare, problema
celor apte poduri din Knigsberg. Aceast banal i totui foarte
controversat problem a dus la apariia i dezvoltarea teoriei grafurilor.
Problema se pune cam aa:
Oraul Knigsberg era aezat pe coasta Mrii Baltice, la gurile rului Pregel. Pe
ru erau dou insule legate de rmuri i ntre ele de apte poduri ca n figura 1.
20
21
Explicaia programului:
Pornim dintr-un vrf neizolat reinut cu ajutorul variabilei prim, n cadrul
procedurii de citire, apoi cutm un ciclu eulerian al grafului printr-un algoritm
backtracking. Vom folosi pentru reinerea ordinii vrfului n ciclul eulerian un
ir s.
22
if (k=m)and(a[s[k],s[1]]=0)then valid:=false;
end;
procedure back(k:integer);
var i,j:integer;
begin
i:=1;
while (i<=n)and(not gasit) do
begin
s[k]:=i;
if valid(k) then
begin
a[s[k],s[k-1]]:=0;
a[s[k-1],s[k]]:=0;
if k=m then
begin
gasit:=true;
writeln('Ciclul eulerian este:');
for j:=1 to m do write(s[j],' ');
writeln(s[1]);
end
else back(k+1);
a[s[k],s[k-1]]:=1;
a[s[k-1],s[k]]:=1;
end;
i:=i+1;
end;
end;
procedure tip;
begin
clrscr;
writeln('Matricea de adiacenta:');
for i:=1 to n do
begin
for j:=1 to n do write(a[i,j],' ');
writeln;
end;
writeln;
end;
begin{PP}
clrscr;
cit;
tip;
if prim<>0 then
24
begin
s[1]:=prim;
gasit:=false;
back(2);
if not gasit then write('Graful nu este eulerian.');
end
else write('Graful nu este eulerian.');
readkey;
end.
n viaa de zi cu zi rezolvm adesea, fr s ne dm seama probleme de grafuri
euleriene, de exemplu cnd vrem s mergem cu trenul n circuit i vrem s
pltim mai puin, calculm n aa fel nct s trecem peste tot i s pltim mai
puin. Dar aceasta nu o facem numai noi i potaii, ci grafurile se utilizeaz la
calcularea poziilor optime de amplasare a sateliilor de comunicaie pentru ca
informaia transmis s foloseasc mai puin timp.
Grafuri hamiltoniene
Se numeste ciclu hamiltonian intr-un graf, un ciclu elementar care contine toate
varfurile grafului.
Un graf care contine un ciclu hamiltonian se numeste graf hamiltonian.
Un lant elementar care contine toate varfurile grafului se numeste lant
hamiltonian.
*
*
Teorem:
Fie G=(X,U), cu n>=3 varfuri, daca oricare ar fi x un nod al grafului si
d(x)>=n/2, atunci graful este hamiltonian.
drum hamiltonian: un drum elementar care trece prin toate nodurile grafului;
circuit hamiltonian: un circuit care trece prin toate nodurile grafului;
25
26
BIBLIOGRAFIE
27
28
29
30