Grafuri orientate Definitie:  Un graf orientat reprezinta o pereche ordonata de multimi G=(X,U), unde X este o multime finita si nevida, numita multimea nodurilor, si U este.

Download Report

Transcript Grafuri orientate Definitie:  Un graf orientat reprezinta o pereche ordonata de multimi G=(X,U), unde X este o multime finita si nevida, numita multimea nodurilor, si U este.

Grafuri orientate
Definitie:

Un graf orientat
reprezinta o pereche
ordonata de multimi
G=(X,U), unde X este o
multime finita si nevida,
numita multimea
nodurilor, si U este o
multime formata din
perechi ordonate de
elemente ale lui X,
numita multimea arcelor.
Un exemplu de graf orientat este:
reţeaua de străzi a unui oraş. Străzile
sunt muchii în graf, iar intersecţiile
reprezintă vârfurile grafului. Întrucât
mergând pe jos ne putem deplasa pe
orice stradă în ambele sensuri, vom
spune că din punctul de vedere al
pietonilor, „graful unui oraş” este
neorientat.
Cu totul altfel stau lucrurile în ceea ce
priveşte conducătorii auto, pentru că în
orice oraş există străzi cu sens unic.
Pentru un şofer străzile trebuie să
primească în graf o anumită orientare.
Desigur că acele străzi pe care se poate
circula în ambele sensuri vor primi
orientare dublă. Am ajuns astfel la
noţiunea de graf orientat.
 Prin noţiunea de
perechi ordonate nu
trebuie să înţelegem
că o muchie este mai
mare decât alta, ci
pur şi simplu că
facem deosebire între
o muchie de forma
(x,z) şi o alta de
forma (y,x). Cu alte
cuvinte muchiile sunt
diferenţiate prin
ordinea de scriere a
simbolurilor.
 Arcul (x,y) nu este
tot una cu arcul
(y,x).



Graful unui vârf.
Gradul exterior al unui vârf x, notat d*(x), reprezintă numărul
arcelor care ies din nodul x, adică numărul arcelor de forma (x,z) ε U.
Analog, se defineşte gradul interior al unui vârf x, notat d-(x), ca
fiind numărul arcelor care intră în nodul x (de forma (y,x) ε U).






Reprezentarea grafurilor orientate
Considerăm un graf orientat G= (X,U) cu m arce şi n noduri.
Cele mai cunoscute forme de reprezentare sunt: matricea de adiacenţă, matricea
vârfuri – arce, matricea drumurilor şi listele vecinilor.
Matricea de adiacenţă
Are aceeaşi semnificaţie ca în cazul grafurilor neorientate: fiecare element a[i,j], cu i,j
ε {1,2,...,n}, este: 1 dacă există arcul (i,j), respectiv 0 în caz contrar.
Datorită orientării, aşa cum am mai spus, arcul (i,j) nu este totuna cu arcul (j,i).
Prin urmare, a[i,j] ≠ a[j,i]. Aşadar matricea de adiacenţă nu mai este simetrică faţă
de diagonala principală, aşa cum se întâmpla în cazul grafurilor neorientate.
 Se numeşte lanţ intr-un graf orientat, o
mulţime de arce L={u1,u2,...,uk}, cu
proprietatea ca oricare doua arce vecine in
mulţime au o extremitate comuna.
 Un lanţ este de fapt un traseu care uneşte
prin arce doua noduri numite extremităţile
lanţului, fără a tine cont de orientarea
arcelor componente.
 Se numeşte drum în graful G, un şir de
noduri D={z1, z2, z3, …, zk}, unde z1, z2,
z3, …, zk aparţin lui x, cu proprietatea că
oricare două noduri consecutive sunt
adiacente, adică există arcele [z1, z2], [z2, z3], …, [zk-1,zk] aparţin lui U.
 Practic, un drum poate fi privit ca un
traseu în care toate arcele au aceeaşi
orientare, dată de sensul de deplasare de
la z1 la zk.
Matricea drumurilor.
Este o matrice d cu n
linii şi n coloane, în
care fiecare element
d[i,j] este :
1, dacă există drum de
la nodul i la nodul j în
graf;
0, în caz contrar.
Algoritmul Roy-Warshall de determinare a
matricei drumurilor
Matricea drumurilor se obţine aplicând
matricei de adiacenţă transformări succesive.
Vom spune că există drum de la nodul i la
nodul j, dacă găsim un nod k (diferit de i, j) cu
proprietatea că există drum de la i la k şi drum
de la j la k.
Grafuri orientate . Aplicatii

 Intr-o clasa sunt n elevi. Dirigintele doreste sa construiasca un sistem
de informare in clasa astfel incat fiecare elev sa sa obtina informatia
cat mai rapid. Dirigintele anunta un elev (seful clasei). Acesta va
anunta alti doi elevi care la randul lor vor anunta fiecare cate trei
elevi. In continuare fiecare elev va anunta alti trei.. Sa se scrie un
program care construieste o astfel de structura de informare.

 Numim transpusul unui graf G=(X,U), graful G’ care are aceeasi
multime de varfuri, arcele sale fiind arcele lui G, dar avand sens
opus. Dandu-se G prin matricea de adiacenta sau prin lista de
adiacenta, sa se determine transpusul grafului dat.

 Sa se genereze matricea drumurilor asociata unui graf
Dandu-se matricea drumurilor asociata unui graf orientat sa se determine daca grafula
are (si sa se afiseze) varfuri izolate.
Fie un graf orientat memorat prin matricea de adiacente. Sa se genereze daca este posibil
un graf avand aceeasi matrice a drumurilor dar numar mai mic de arce (eventual numar
minim de arce).
Un arbore genealogic retine cele m relatii a n persoane: cei 2 stramosi comuni si in
continoare perechi care reprezinta ascendent-descendent direct. Sa se afiseze pentru o
persoana x:
-ascendentii
-descendentii
-parintele
-fratii
Aplicatii
 Elevii unei clase au de scris o compunere la limba franceza. Deoarece doresc sa se inspire unii
de la altii, ei isi imprumuta unii altora caietele in care si-au scris temele. Se cunosc perechile de
elevi (numerotati de la 1 la n) care si-au imprumutat caietele. Primul din pereche este cel care a
dat tema, al doilea – cel care l-a primit. Se considera ca daca X a dat caietul lui Y, iar Y lui Z,
tema lui Z este inspirata atat din tema lui X, cat si din tema lui Y. Scrieti un program care sa
afiseze:
 La cati colegi a imprumutat caietul fiecare elev si de la cati colegi a imprumutat fiecare
 Caror colegi le-a imprumutat X caietul sau
 Elevul care a dat caietul celor mai multi colegi
 Elevul care a luat cele mai multe caiete pentru a se inspira
 Tema carui elev a inspirat cele mai multe alte teme
 Exista elevi in clasa care nu au dat si nu au primit nici un caiet? Care?
 Se citeste de la tastatura o lista de elevi (nr. lor de ordine). Precizati daca este adevarat faptul
ca fiecare elev din lista a imprumutat caietul de la cel care urmeaza imediat dupa el in lista.

 Baietii dintr-o scoala corespondeaza cu fetele dintr-o alta scoala. Copii sunt numerotati de la 1
la n. Se cunosc perechi de numere (x-y) cu semnificatia: (x ii scrie lui y, nu neaparat si invers).
Se stie ca nici un baiat nu corespondeaza cu alt baiat si nici o fata cu alta. Cititi perechile de
directii de corespondenta si afisati (daca este posibil) grupa fetelor si grupa baietilor. Copilul 1
este baiat.
 Intr-un parc de distractii exista un trenulet
care trece prin mai multe tuneluri. Se cunosc:
numarul de tuneluri, numarul de portiuni de
sina de tren si sensul de parcurgere intre doua
tuneluri alaturate. Proprietarul parcului are
la dispozitie nc culori si isi propune sa
vopseasca tunelurile astfel incat oricare doua
tuneluri alaturate sa fie colorate diferit.
Afisati 3 solutii.

 La un concurs de orientare juriul are o harta
de repere intre repere fiind stabilite sensuri
unice de parcurgere. Pentru a complica probele
trebuie aleasa o harta care sa contina cel putin
un circuit. Verificati daca harta contine circuite.

 Sa se determine produsul numerelor de ordine
al varfurilor unui graf prin parcugrgere in
latime si adancime. Afisati valoare mai mare.

Proprietati
 Daca un graf cu n noduri are p comp conexe,atunci
numarul minim de muchii care trebuie adaugat ca sa
devina conex este p-1.
 Daca un graf conex cu n noduri are n-1 muchii, atunci
orice pereche de noduri este legata printr-un lant si
numai unul.
 Daca un graf neorientatat cu n noduri si m muchii este
conex, numarul maxim de muchii care se pot elimina
pentru a obtine un graf partial conex este: m-n+1.
 Daca un graf are n noduri,m muchii si p componente
conex, numarul de muchii care trebuie eliminate pentru
a obtine un graf partial aciclic este egal cu m-n+p.
Aplicatie practica a grafurilor orientate
• O companie petroliera dispune intr-un
oras de n benzinarii. Unele din aceste
statii de benzina sunt legate intre ele
prin drumuri directe(pe care se poate
circula in ambele sensuri sau intr-un
singur sens),iar altele nu. Pentru
fiecare drum direct intre doua
benzinarii se cunoaste lungimea
acestui in kilometri.Domnul X se afla
in masina la marginea
orasului.Indicatorul de benzina se
apropie de 0,ceea ce ii arata domnului
X ca trebuie sa alimenteze urgent.
Realizati un program prin care se
indica drumul cel mai scurt de a
ajunge la una din cele mai apropiate
benzinarii,aflata pe un drum direct.
Rezolvarea aplicatiei!
•
•
•
•
•
•
•
•
•
•
•
•
#include<iostream.h>
#include<fstream.h>
int n, a[100][100],x,y;
void citire()
{int i,j;
cin>>n;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cin>>a[i][j];}
}
void Roy_Warshall()
{int i,j,k;
•
•
•
•
•
•
•
•
•
•
•
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==0&&i!=k&&j!=k)
a[i][j]=a[i][k]*a[k][j];}
void afisare()
{int i,j;
for(i=1;i<=n;i++)
{cout<<"\n";
for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";}}
•
•
•
•
•
•
•
•
•
•
•
int drum_int(int x)
{int j,nr=0;
for(j=1;j<=n;j++)
if(a[j][x]==1) nr++;
return nr;}
int drum_ext(int x)
{int i,nr=0;
for(i=1;i<=n;i++)
if(a[x][i]==1) nr++;
return nr;}
}
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
void generare_drum_min()
{int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][k]+a[k][j]<a[i][j])
a[i][j]=a[i][k]+a[k][j];}
void main()
{cout<<"Matricea de adiacenta este:";
cout<<endl;
citire();
Roy_Warshall();
cout<<"Matricea drumurilor este:";
afisare();
cout<<"Nodul x= ";
cin>>x;
drum_int(x);
drum_ext(x);
generare_drum_min();
Comentarii.Observatii.
 Avand in vedere ca in prezent pretul benzinei este destul de
ridicat si cei mai multi dintre romani isi alimenteaza automobilul
cu putina benzina,exista un risc mai ridicat ca acestia sa ramana
fara combustibil. In caz ca va veti confrunta cu o asemenea
situatie,noi am utilizat teoria grafurilor orientate si am creat o
aplicatie “originala” pentru a va scoate din impas. Prin aceasta
problema se calculeaza drumul cel mai scurt( drumul minim)
pentru a ajunge la cea mai apropiata benzinarie. Astfel,va veti
alimenta rezervorul si va veti putea continua drumul linistiti.
Putem prezenta si situatia in care
calculam drumul maxim:
void generare_drum_max()
{int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][k]+a[k][j]>a[i][j])
a[i][j]=a[i][k]+a[k][j];}
 Dar,daca veti folosi aceasta varianta,sa folositit
drumul maxim (drumul cel mai lung) pentru a
ajunge la benzinariei,exista riscul ca autovehiculul
sa se opreasca inainte de a ajunge la destinatie.
In concluzie…cea mai eficienta
metoda,ramane aplicarea
drumului minim!
 Proiect realizat de :





Terciu Andreea
Rotariu Alina
Macuc Alina
Munteanu Irina
Sancariuc Diana