Sunteți pe pagina 1din 45

GRAFURI

Chestiuniteoretice.
Ungraforientat(digraf)Gesteopereche(V,E),undeCesteomultimefinita,iarEesteorelatie
binarapeV.MultimeaVsenumestemultimeavarfurilorluiG,iarelementeleeisenumescvarfuri.Multimea
EsenumestemultimeaarcelorluiG,iarelementeleeisenumescarce.
Exemplu:

a)

05/20/16

V={1,2,3,4,5,6}
E={(1,2),(2,2),(2,5),(4,1),(4,5),(5,4),(6,3)}
Varfurilesuntreprezentateprincercuri,iararceleprinsageti.Autobuclelesuntarcedelaunvarflaelinsusi.
Intr-ungrafneorientatG=(V,E),multimeamuchiilorEesteconstituitadinperechidevarfurineordonate,si
nudinperechiordonate.Omuchieesteomultime{u,v}undeu,vVsiuv.Princonventie,pentruo
muchievomfolosinotatia(u,v)inloculnotatieipentrumultimi{u,v},iar(u,v)si(v,u)seconsideraafi
aceeasimuchie.
Intr-ungrafneorientat,autobuclelesuntinterzisesi,astfel,fiecaremuchieesteformataexactdindouavarfuri
distincte.

b)
1

05/20/16

V={1,2,3,4,5,6}
E={(1,2),(2,5),(3,6),(1,5)}
Varful4esteizolat.
Multedefinitiipentrugrafuriorientatesineorientatesuntaceleasi,desiuniitermenipotaveaseminificatii
diferiteinceledouacontexte.
Daca(u,v)esteunarcintr-ungraforientatG=(V,E),spunemca(u,v)esteincidentdinsaupleacadinvarful
usiesteincidentinsauintrainvarfulv.Deexempluarcelecarepleacadinvarful2infiguraa)sunt(2,5),
(2,4),(2,2).Arcelecareintrainvarful2sunt(1,2),(2,2).
Daca(u,v)esteomuchieintr-ungrafneorientatG=(V,E)spunemca(u,v)esteincidentavarfurilorusiv.In
figurab)muchiileincidentevarfului2sunt(1,2)si(2,5).
Daca(u,v)esteomuchie(arc)intr-ungrafG=(V,E)spunemcavarfulvesteadiacentvarfuluiu.Dacagraful
esteneorientat,relatiadeadiacentaestesimetrica.Intr-ungraforientatrelatiadeadiacentanuesteneaparat
simetrica.Dacavesteadiacentvarfuluiuintr-ungraforiantatsefolosestenotatiauv.Infigurileasib,
varful2esteadiacentvarfului1,deoarecemuchia(arcul)(1,2)ambelorgrafuri.Varful1nuesteadiacent
varfului2infig.a,deoarecemuchia(2,1)nuapartinegrafului.
Gradulunuivarfalunuigrafneorientatestenumaruldemuchiiincidenteacestuia.Deexemplu,varful2din
fig.baregradul2.Unvarfalcaruigardeste0senumestevarfizolat(ex.varful4).
Intr-ungraforientat,gradulexterioralunuivarfestenumarularcelorcepleacadinel,iargradulinterioral
unuivarfestenumarularcelorceintrainel.Gradulunuivarfalunuigraforientatestegradulsauexteriorplus
gradulsauinterior.Varful2dinfig.aaregradulinterior2gradulexterior3sigradul2+3=5.
Undrumdelungimekdelaunvarfulaunvarfuintr-ungrafG=(V,E)esteunsirdevarfuri<V0,v1,...Vk>
astfelincatu=v0,u=vksi(vi-1,vi)Epentrui=1,2,...k.
05/20/16

Lungimeaunuidrumestenumaruldemuchii(arce)dinaceldrum.Drumulcontinevarfurilev 0,v1,v2...vksi
muchiile(v0,v1),(v1,v2),...(vk-1,vk).Dacaexistaundrumpdelaulauspunemcauesteaccesibildinuprinp,
relatiereprezentatasiprinu=>udacaGesteorientat.Undrumesteelementardacatoatevarfuriledinelsunt
distincte.Ex.infig.adrumul<1,2,5,4>esteundrumelementardelungime3.Drumul<2,5,4,5,>nueste
elementar.
Unsubdrumalunuidrump=<v0,v1,...vk>esteunsubsircontinuualvarfurilorsale.Pentruorice0ijk,
subsiruldevarfuri<vi,vi+1,...,vj>esteunsubdrumalluip.
Intr-ungraforientat,undrum<v0,v1...vk>formeazauncicludacav0=vksidrumulcontinecelputinomuchie.
uu
Ciclulesteelementardacav1,v2...vksuntdistincte.Oautobuclaesteuncicludelungime1.
Douadrumuri<v0,v1,v2,...vk-1,v0>si<v0,v1,v2,...vk-1,v0>formeazaacelasicicludacaexistaunintregj
astfelincatvi=V(i+j)modKpentrui=0,1,..k-1.Ex.infug.adrumul<1,2,4,1>formeazaacelasicicluca
drumurile<2,4,1,2>si<4,1,2,4>.Acestcicluesteelementar.Ciclul<1,2,4,5,4,1>nuesteelementar.
Ciclul<2,2>fomatdinmuchia(2.2)esteoautobucla.Ungraforientatfaraautobucleesteelementar.
Intr-ungrafneorientatundrum<v0,v1,...vk>formeazauncicluelementardacak>3,v0=vksivarfurilev1,v2...vk
suntdistincte.Deexempluinfig.bdrumul<1,2,5,1>esteuncicluelementar.Ungraffaracicluriesteacidic.
Ungrafneorientatesteconexdacafiecareperechedevarfuriesteconectataprintr-undrum.Componenetele
conexealeunuigrafsuntclaseledeechivalentaalevarfurilorsubrelatiaesteaccesibildin.Grafulbare3
componenteconexe:{1,2,5},{3,6},{4}.Fiecarevarfdin{1,2,5}esteaccesibildinfiecarevarfdin{1,2,5}.

05/20/16

Ungrafneorientatesteconexdacaareexactocomponentaconexa,sau,altfelspus,dacafiecarevarf
esteaccesibildinfiecarevarfdiferitdeel.
Ungraforientatestetareconexdacafiecaredouavarfurisuntaccesibiledincelalalt.Componenetele
tareconexealeunuigrafsuntclaseledeechivalentaalevarfurilorsubrelatiasuntreciprocaccesibile.
Ungraforientatestetareconexdacaaredoarosinguracomponentatareconexa.Grafuldinfig.aare3
componentetareconexe:{1,2,4,5},{3}si[6}.Toateperechiledevarfuridin{1,2,4,5}suntreciproc
accesibile.Varfurile[3,6}nuformeazaocomponentatareconexa,deoarecevarful6nuesteaccesibildin
varful3.
DouagrafuriG=(V,E)siG=(V,E)suntizomorfedacaexistaobijectief:VVastfelincat
(u,v)Edacasinumaidaca(f(u),f(v))E.Cualtecuvinte,pentruareetichetavarfurileluiGpentruca
acesteasafievarfuridinG,pastrandmuchiilecorespunzatoaredinGsiG.Figuraaaprezintaoperechede
grafuriGsiGcumultimiledevarfuriV={1,2,3,4,5,6}siV={u,v,w,x,y,z}.FunctiadinVinV,datadef(1)
=u,f(2)=v,f(3)=w,f(4)=x,f(5)=y,f(6)=zestefunctiabijectivaceruta.
Grafuriledinfig.bbnusuntizomorfe.Desiambelegrafuriau5varfurisi7muchii,grafuldinpartea
superioaraarevarfcugradulegal4,intimpcegrafuldinparteainferioaraafiguriinuposedaunastfelde
varf.

05/20/16

Fig.aa
G

3
5

Fig.bb

2
u

3
4

05/20/16

SpunemcaungrafG=(V,E)esteunsubgrafalgrafuluiG=(V,E)dacaV=VsiE.E.Dacafiindo
multimeVV,subgrafulluiGindusdeVestegrafulG=(V,E)unde
E={(u,v)E:u,vV}
Subgrafulindusdemultimeadevarfuri[1,2,3,6}dinfig.aapareinfig.c
3
1

2
6

siaremultimeademuchii{(1,2),(2,2),(6,3)}
FiinddatungarfneorientatG=(V,E),versiuneaorientataluiGestegrafulorientatG(V,E)unde
(u,v)Edacasinumaidaca(u,v)E.Adicafiecaremuchieneorientata(u,v)dinGesteinlocuitain
versiuneaorientatprindouaarceorientate(u,v)si(v,u).
InverspentruungraforientatG=(V,E),versiuneaneorientataaluiGestegrafulneorientatG=
(V,E)unde(u,v)Edacasinumaidacauvsi(u,v)E.VersiuneaneorientacontinearceleluiGcu
directiileeliminatesicuautobucleleeliminate.Deoarece(u,v)si(v,u)reprezintaaceeasimuchieintr-ungraf
neorientat,versiuneaneorientataaunuigraforientatocontineosinguradata,chiardacagrafulorintatcontine
atatmuchia(w,v)catsimuchia(v,u).
Intr-ungraforientatG=(V.E),unvecinalunuivarfuesteoricevarfcareesteadiacentluiuin
versiuneaneorientataaluiG.decivestevecinaluiudaca(u,v)Esau(v,u)E.Intr-ungrafneorientat,u
sivsuntvecinedacasuntadiacente.

05/20/16

Ungrafcompletesteungrafneorientatincareoricaredouavarfurisuntadiacente.Ungrafbipartitesteun
grafneorientatG=(V,E)incaremultimeaVpoatefipartitionatain2multimiV1siV2astfelincat(u,v)E
implicafiecauV1sivV2,fiecauV2sivV1,adicamuchiilemergdelamultimeaV1lamultimeaV2
sauinvers.
Ungrafneorientat,aciclicesteopadure,iarungrafneorientat,aciclicsiconexesteunarbore
(liber).
Reprezentareagrafurilor

ExistadouamoduristandarddereprezentareaunuigrafG=(V,E):
-caomultimedelistadeadiacentasau
-caomatricedeadiacenta
Reprezentareaprinlistedeadiacentaestepreferatapentrucaoferaunmodcompactdereprezentarea
grafurilorrareaceleapentrucare|E|numaruldemuchii(arce)gradulestemultmaimicdecat|V|2(patratul
numaruluidevarfuri).
Reprezentareaprinmatricedeadiacentaestepreferataatuncicandgrafulestedens,adica|E|este
aproximativegalcu|V|2sauatuncicandtrebuiesadecidem,rapid,dacaexistaomuchiececonecteazadoua
varfuridate.
ReprezentareaprinlistedeadiacentaaunuigrafG=(V,E)constadintr-untablouAdjcu|V|liste,una
pentrufiecarevarfdinV.PentrufiecareuV,listadeadiacentaAdj[u]continepointerilatoatevarfurilev
pentrucareexistaomuchie(u,v)E.ListaAdj[u]esteformatadintotalitateavarfuriloradiacenteluiuinG.
Varfuriledinfiecarelistadeadiacentasuntmemorateintr-oordinearbitrara.

05/20/16

Exemplul1.Fiegrafulorientat:
a)

listeledeadiacentasunt:

1
2

2-

3
4

6-

5
6

05/20/16

4-

55-

2-

46-

05/20/16

1*

4*

6*

9*

11*

13*

10

11

12

13

14

10

Exemplul2.Fiegrafulneorientat:
b)
1

2
3

listeledeadiacentasunt:

1
2
3
4
5

05/20/16

2-

5-

1-

5-

2-

4-

5-

2-

3-

4-

1-

2-

3-

4-

11

DacaGesteungraforientat,sumalungimilortuturorlistelordeadiacentaeste|E|,deoareceunarcdeforma
(u,v)estereprezentatprinaparitialuivinAdj(u).
DacaGesteungrafneorientat,sumalungimilortuturorlistelordeadiacentaeste2*|E|,deoarece,
daca(u,v)esteomuchie,atuncinapareinlistadeadiacentaaluivsiinvers.
Indiferentdacaungrafesteorientatsaunu,reprezentareaprinlistadeadiacentaareproprietatea
dezirabilacadimensiuneamemorieinecesareesteO(max(V,E))=O(V,E).
Listeledeadiacentapotfiusoradaptatepentrureprezentareagrafurilorcucosturi(ponderate),adicaacele
grafuriincarefiecareimuchiiis-aasociatuncostdat,deobicei,deofunctiedecostw:ER.Deexemplu,
dieG=(V,E)ungrafcucosturiavandfunctiadecostw.Costulw(u,v)almuchiei(u,v)Eestememoratpur
sisimpluimpreunacuvarfulvinlistadeadiacentaaluiu.Reprezentareaprinlistedeadiacentaestefoarte
robustainsensulcapoatefimodificatapentruasuportamultealtevariantedegrafuri.
Undezavantajalreprezentariiprinlistedeadiacentaesteacelacanuexistaaltacalemairapida
deadeterminadacaomuchie(u,v)apartinegrafului,decatcautarealuivinlistadeadiacentaaluiu,Adj[u].
Dezavantajulacestapoatefiremediatfolosindoreprezentareagrafuluiprinmatricedeadiacenta,dar
solicitandmaimultamemorie.
PentruareprezentaungrafG=(V,E)prinmatricedeadiacentapresupunemcavarfurileuVsunt
numerotateinmodarbitrarcu1,2,...|V|.reprezentareaconstaintr-omatriceA=(aij)dedimensiune|V|x|V|
astfelincat:

1 daca (i, j ) E
0

aij=

05/20/16

12

Matriceledeadiacentaalegrafurilorasibsunt:

1 2 3 4

5 6

0 1 0 1

0 0

1 2 3 4 5

0 0 0 0

1 0

1 0 1 0 0 1

0 0 0 0

1 1

2 1 0 1 1 1

0 1 0 0

0 0

3 0 1 0 1 0

0 0 0 1

0 0

4 0 1 1 0 1

0 0 0 0

0 1

5 1 1 0 1 0

graforientat

05/20/16

graforientatmatricesimetrica

13

Necesaruldememoriepentrumatriceadeadiacentaeste(V2)sinudepindedenumarulde
muchiialegrafului.
Deoareceintr-ungrafneorientat(u,v)si(v,u)reprezintaaceeasimuchie,matriceadeadiacentaA
estepropriasatranspusaA=At.
Inanumiteaplicatiiesteavantajossastocam(memoram)numaielementelesituatepesideasupra
diagrameiprincipale,reducandnecesaruldememorielajumatate.
Lafelcalareprezentareaprinlistedeadiacenta,lareprezentareaprinmatricedeadiacenta,acesta
poatefifolositasipentrugrafuricucost(ponderate).DacaG=(V,E)esteungrafcucost,avandcostulunei
muchiidatdefunctiaw,costulw(u,v)almuchiei(u,v)Eestememoratpursisimplucaunelementinliniau
sicoloanavamatriceideadiacenta.Dacaomuchienuexista,elementulcorespunzatorpoatefiNULL,NIL,0
sau.
Simplitateamatriceideadiacentaofacepreferabila,atuncicandgrafulareunnumarrelativmicde
noduri,dacagrafulestefaracosturi,avantajulreprezentariiprinmatricedeadiacentaestereprezentarea
fiecaruielementalacestuiapecateunbit.

Folosindpentrureprezentareagrafurilorlisteledeadiacentaultimavariantadescriereastructurilordedatesia
functiilordeaccessideinitializareaaferentesedaumaijos.
Modululcomune.hcontinedefinitiileunorconstantesimbolicesimacroinstructiunilereferitoarelatratarea
erorilor.Modululgraf.hcontinedeclaratiilestructurilordedatesifunctiilereferitoarelagrafuri.Definitiile
acestorasuntdateinmodululgraf.c

05/20/16

14

/*comune.h*/

#ifndefNmaxNoduri
#defineNmaxNoduri
20
#defineNmaxLegaturi
NmaxNoduri*4
#definebool
int
#defineTrue
1
#defineFalse 0
#defineEROARE(text)
{printf("\nEroare:"#text"\n");returnFalse;}
#defineEX_EROARE(text){printf("\nEroare:"#text"\n");
exit(EXIT_FAILURE);}
#endif

/*
graf.h
*/

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include"comune.h"

externintCap[NmaxNoduri];
externintLegaturi[NmaxLegaturi];
externintNNoduri,NLegaturi;

05/20/16

15

boolAflaLegaturaUrmatoare(intLegaturaCurenta,int*LegaturaUrmatoare);
boolAflaNod(intLegaturaCurenta,int*NodCurent);
boolAflaCap(intnod,int*PrimaLegatura);
boolAflaLegatura(intDela,intLa,int*Legatura);
boolCitesteGraf();

/*graf.c*/

#include"graf.h"

intCap[NmaxNoduri];
intLegaturi[NmaxLegaturi];
intNNoduri,NLegaturi;
/*aflalegaturaurmatoarecaindiceintabloulLegaturi*/

boolAflaLegaturaUrmatoare(intLegaturaCurenta,int*LegaturaUrmatoare)
{
if(Legaturi[LegaturaCurenta]==0)
returnFalse;
*LegaturaUrmatoare=LegaturaCurenta+1;
returnTrue;
}

05/20/16

16

/*aflanoduldinvirfulunuiarc*/

boolAflaNod(intLegaturaCurenta,int*NodCurent)
{
if(LegaturaCurenta>NLegaturi)
returnFalse;
*NodCurent=Legaturi[LegaturaCurenta];
returnTrue;
}
/*aflaprimalegaturaaunuinod,pastrataintabloulCap*/

boolAflaCap(intnod,int*PrimaLegatura)
{
if(nod>NNoduri)
returnFalse;
*PrimaLegatura=Cap[nod];
returnTrue;
}
/*aflalegaturaintredouanoduriindicate*/

boolAflaLegatura(intDeLa,intLa,int*Legatura)

05/20/16

17

{
inti;
if(DeLa>NNoduri||La>NNoduri)
returnFalse;/*depasirenumarcurentde
noduri*/
i=Cap[DeLa];
while(Legaturi[i]!=La&&Legaturi[i]!=0)i++;
*Legatura=i;
if(Legaturi[i]==0)*Legatura=0;
returnTrue;
}

/*initiazagraful/ActualizeazatablCapsiLegaturiconformcugraful
propusdeutilizator/
rezultatulesteFalsedacasedepasestenumarulmaximdelegaturi/True
dacainitializareasefacecorect*/

boolCitesteGraf()
{
intn,i,j,LegaturaCurenta;
do{
printf("\nnumarnoduri(<=%d):",NmaxNoduri);
scanf("%d",&NNoduri);
}while(NNoduri>NmaxNoduri);

05/20/16

18

LegaturaCurenta=1;
for(i=1;i<=NNoduri;i++){
Cap[i]=LegaturaCurenta;
printf("datinodurileadiacntlui%d;0pentru
terminare\n",i);
do{
do{
printf("nod");
scanf("%d",&j);
}while(j>NNoduri);
Legaturi[LegaturaCurenta++]=j;
}while(j!=0&&LegaturaCurenta<NmaxLegaturi);
if(LegaturaCurenta==NmaxLegaturi&&j!=0)
returnFalse;
}
NLegaturi=LegaturaCurenta;
returnTrue;
}

05/20/16

19

Metodedecautareintr-ungraf

Cautareaintr-ungrafinseamnaparcurgerea,inmodsistematic,amuchiilorgrafuluiastfelincatsa
parcurgemvarfurilegrafului.Unalgoritmdecautareintr-ungrafpoatedescoperimulteinformatiidespre
structuragrafuluirespectiv.Astfeluniialgoritmiidegrafuriincepprinacautaingrafuldeintrarepentrua
obtineaceastainformatiestructurala,iaracestialgoritmisuntsimplerafinarialeunoralgoritmidecautarede
baza.

Cautareinlatime(AlgoritmulBFbreadthfirst)

FieungrafG=(V<E)siunnodsursas,cautarea(parcurgerea)inlatimeexploreazasistematic
muchiileluiGpentruadescoperifiecarenodcareesteaccesibilluis.Algoritmulcalculeazadistanta(cel
maimicnumardemuchii)delaslatoatevarfurileaccesibile.Elproduceunarboredelatimecuradacinas,
carecontinetoateacestevarfuriaccesibile.Pentrufiecarevarfvaccesibildins,caleadinarboreledelatime
delaslavcorespundeunuicelmaiscurtdrumdelaslavinG,adicaundrumcarecontineunnumarminim
demuchii.Algoritmulfunctioneazaatatpegrafuriorientatecatsipegrafuineorientate.
Parcurgereainlatimeestenumitaastfelpentrucalargeste,uniform,frontieradintrenodurile
descoperitesicelenedescoperite,pelatimeafrontierei.Aceastainseamnacaalgoritmuldescoperatoate
varfurileaflateladistantakfatadesinaintedeadesoperivreunvarfladistantak+1.
Exemplu.Fiegrafulneorientatsis=1,arboreledelatimearataastfel:

05/20/16

20

1
2

2
6

4
6

8
7

Ordineadeparcurgereesteurmatoarea:
1,2,3,4,5,6,7,8
Adicaestevizitataradacinaculoaruluidelatime,apoisuntvizitatevarfuriledepenuvelul1,apoicelede
penivelul2s.a.m.d.
Pentruatineevidentanodurilorparcurse,cautareinlatimesecoloreazafiecarenodcualb,gri
saunegru.Pentruinceputtoatevarfurilesuntcoloratelainceputinalbsipotdeveniapoigrisaunegru.Un
varfestedecoperitcandesteintalnitprimadataintimpuluneicautari,momentincarenumaiestealb.De
aceeavarfurilegrisinegrusuntdescoperite,daralgoritmulfacedistinctieintreelepentruafisigurca
procesuldecautarearelocpelatime.Daca(u,v)Esivarfuluestenegru,atuncivarfulvastesaugrisau
negru,adicatoatevarfurileadiacenteunuinodnegruaufostdescoperite.Varfurilegripotaveavarfuri
adiacentealbe.Acesteareprezintafrontieraintrevarfuriledescoperitesicelenedescoperite.

05/20/16

21

Algoritmuldeparcurgere(cautare)inlatimeconstruiesteunarboredelatimececontine,initial,numai
radacinasacareestevarfuls.Decateoriunvarfalbvestedescoperitincursulparcurgeriilisteideadiacenta
aunuivarfudejadescoperit,virfulvsimuchia(u,v)suntadaugateinarbore.Inacestcaz,spunemcaueste
predecesorulsauparinteleluivinarboreledelatime.Deoareceunvarfestedescoperitcelmultodata,el
poateaveacelmultunparinte.Relatiiledestramossidescendent,dinarboreledelatime,suntdefiniterelativ
laradacinasinmodobisnuit:dacauseaflapeundrumdinarboredelaradacinaslavarfulv,atunciuesteun
stramosalluiv,iarvesteundescendentalluiu.
ProceduradecautareinlatimeBFpresupunecagrafulG=(V,E)estereprezentatfolosindliste
deadiacenta.
Algoritmulfolosestemaimultestructuridedatepentrufiecarevarfdingraf.Culoareafiecarui
varfuVestememoratainvariabilaculoare(u),iarpredecesorulluiuestememoratinvariabilaP(u).Daca
unuareniciunpredecesor(deex.dacau=ssauunuafostdescoperit)atunciP(u)=NULL.Distantadela
sursaslavarfulu,calculatadealgoritm,estememorataind(u).Inalgoritmsefolosesteocoada,Qdetipul
primulsosit,primulvenit,FIFO,pentruaprelucramultimeadevarfurigri.
AlgoritmulBF

05/20/16

22

proceduraBF(G,s)este:
11.

|pentru*fiecarevarfuV[G]{s}executa
22. |culoare[u]alb
33. |
d[u]
44. |__o
p[u]NULL
55. culoare[s]gri
66. d[s]0
77. P[s]null
88. Q{s}
9

|__o

sfarsit

05/20/16

23

9|cattimpQ0executa
10.|ucap[Q]
11|pentru*fiecarevarfvAdj[u]executa
12|
|dacaculoare[v]=albatunci
13|
|
culoare[v]gri
14|
|
d[v]d[u]+1
15|
|
p[u]u
16|
|__o
*puneincoada(Q,v)//QQ+v
17|scoatedincoada(Q)
18|color[u]negru
sfarsit

05/20/16

24

ProceduraBF()opereazaastfel:liniile14coloreazatoatevarfurileinalb,atribuielui[u]valoareapentru
fiecarevarfusiseteazaparintelefiecaruivarfpeNULL.Linia5colorezavarfulsursasingri,deoareceel
esteconsideratdescoperitatuncicandseintrainprocedura.Linia6initializeazad[s]cu0,iarlinia7
initializeazapredecesorulsurseicuNULL.Linia8initializeazaCOADAQcus(Qcontinemultimea
varfurilorgri).
Buclaprincipalaaprogramuluiestecontinutainliniile918.Iteratiaareloccattimpmaiexista
varfurigri,adicavarfuridescoperiteacarorlistadeadiacentanuafostexaminatainintregime.
Linia10determinavarfulgriudincapulcoziiQ.Buclapentrudinliniile1116,considerafiecare
varfvdinlistadeadiacentaluiu.Dacavestealb,atuncielnuafostincadescoperitsialgoritmulildescopera
executandliniile1316.Lainceput,elestecoloratcugri,iardistantad[v]esteinitializatacud[u]+1.Apoi,
uesteinregistratcaparintealsau.Infinal,varfulvesteplasatlasfarsitulcoziiQ.Candtoatevarfuriledin
listadeadiacentaaluiuaufostexaminate,uestescosdincoadaQsicoloratinnegruinliniile1718.
Exemplu:Fiegrafulneorientat:

sivarfulsursa(initial)s.Arboreledelatimevafi:

05/20/16

25

nivelul0

nivelul1

nivelul2

nivelul3

05/20/16

s
r

26

parcurgereaBFeste:srwvxtyu
listeledeadiacenta:

05/20/16

w-

r-

t-

x-

v-

s-

x-

u-

s-

w-

r-

27

ExecutiaalgorimuluiBFpeacestgrafneorientaturmeaza.Muchiilearboreluisuntprezentate
hasurat(dublate)asacunsuntprodusedeBF.Impreunacufiecarevarfu,esteprezentatasid[u].CoadaQeste
prezentatalainceputulfiecareiiteratiiabucleicattimpdinliniile918.Distantelevarfurilorsuntprezentate
langavarfuriledincoada.
a)

b)

rstu

rstu

vwxy

05/20/16

Q
s

Wr
11

vwxy

28

rstu
1

rtx

c)
122

vwxy

rstu
1

txv

d)
222

vwxy

05/20/16

29

rstu
1

xvu

e)
223

vwxy

rstu
1

vuy

f)
233

vwxy

05/20/16

30

rstu
1

uy

g)
33

vwxy

h)

i)
rstu

rstu
1

vwxy

05/20/16

vwxy

31

Inconcluziecautareainlargimecontinuaintotdeaunacuprimulnodvizitatcaremaiarearceneexplorate.
PentruaceastasefolosesteocoadaQincareseinscriunodurileinordineaincaresuntintilnite:nodulinitial
s,apoinoduriler,w,adiacenteluis,apoiceleadiacenteluiwetc.
Unpseudocodalacestuitipdecautare:
ExporareInLargime(s)este
Explorate<-{s}
*prelucreazainformatiadins
*introdusincoadaQ
|cattimpQ<>coada_vidaexecuta
|v<-primulnoddincoadaQ
||pentru*fiecarenodwadiacentluivexecuta
|||dacawnuapartineluiExplorateatunci
|||*adaugawlaExplorate
|||*prelucreazainformatiadinw
|||*introduwincoadaQ
||-
|Pentruimplementaresefacurmatoareleprecizari:
Seimplementeazacoadaprintr-untabloudeintregisinucaostructuradinamica.Aceastasolutieesterigidasi
ineficienta,fiindaleasapemotivulsimplitatiidescrierii.Functiiledeaccessidemodificareutilizatesunt
similarecelordincazulgeneral.

05/20/16

32

/*coada.h*/

#include"comune.h"

typedefintCOADA[NmaxLegaturi];

boolInitializareCoadaI(COADAQ);//initializeazastructurarezervataQ
boolIntroduceInCoadaI(COADAQ,inte);//introduceunelementnoula
sfirsitulcozii
boolExtrageDinCoadaI(COADAQ,int*pe);//extrageelementuldela
inceputulcozii
-boolTestCoadaGoalaI(COADAQ);//testeazadacaexistaelementeincoadaQ
- multimeavizitataesteimplementatacauntablou.
-- sefolosestestilulprogramariidefensivecucaptareatuturorerorilorposibile
-- sefaceparcurgereatuturornodurilorgrafului.Prelucrareafiecaruinodconstadoarinafisareaetichetelor
sale

/*coada.c*/
#include "coada.h"
int NrElem;
bool InitializareCoadaI(COADA Q){
NrElem=0;
return True;
}
05/20/16

33

bool IntroduceInCoadaI(COADA Q, int e){


if (NrElem<NmaxLegaturi){
Q[NrElem]=e;
NrElem++;
return True;
}
return False;
}
bool ExtrageDinCoadaI(COADA Q,int *pe){
int i;
if (NrElem>0){
*pe=Q[0];
for (i=0;i<NrElem-1;i++){
Q[i]=Q[i+1];
}
NrElem--;
return True;
}
return False;
}
bool TestCoadaGoalaI(COADA Q){
if (NrElem==0) return True;
return False;
}
05/20/16

34

/*larg.c*/

#include "graf.h"
#include "graf.c"
#include "coada.c"
#include <conio.h>
int Vizitate[NmaxNoduri];
int ExplorareInLargime(int s)
{
int w, nw,PrimaLegatura;
COADA Q;
InitializareCoadaI(Q);
Vizitate[s]=1;
printf("vizitat nodul %d\n",s);
if(!AflaCap(s,&PrimaLegatura))
EROARE("Aflarea primului nod adiacent" )
if(!IntroduceInCoadaI(Q,PrimaLegatura))
EROARE(Introducere in coada)
while(!TestCoadaGoalaI(Q)){
if(!ExtrageDinCoadaI(Q,&w))
EROARE(Extragere din coada)

05/20/16

35

while(AflaNod(w,&nw) && (nw!=0)){


if(Vizitate[nw]==0){
Vizitate[nw]=1;
printf("vizitat nodul %d\n",nw);
if(!AflaCap(nw,&PrimaLegatura))
EROARE(Aflare nod adiacent)
if(!IntroduceInCoadaI(Q,PrimaLegatura))
EROARE(introducere in coada)
}
if(!AflaLegaturaUrmatoare(w,&w))
EROARE(Aflare legatura urmatoare)
}
}
return True;
}
bool main()
{

05/20/16

36

int start;
clrscr();
CitesteGraf();
for(start=1;start<NNoduri;start++)
Vizitate[start]=0;
for(start=1;start<NNoduri;start++)
if(Vizitate[start]==0){
printf("\n Exporare din %\d\n",start);
if(!ExplorareInLargime(start))
exit(EXIT_FAILURE);
}
printf("\n sfirsit explorare");
exit(EXIT_SUCCESS);
return;
}
CautareainadincimeDF(depthfirst)

AlgoritmulDF(depthfirst)sedeosebestedealgoritmulBF(breadthfirst)prinaceeacaexplorarea
continuaintotdeaunacuultimulnodvizitatcaremaiarearceneexplorate.Pentruarealizaacestlucruse
folosesteostivaincareseinscriunodurileinordineaincaresuntintilnite:nodulinitial1apoiprimulnod2
adiacentlui1,apoiprimulnodadiacentlui2etc.Defiecaredataseexploreazaurmatoarealegaturaanodului
dinvarfulstivei,nodulfiindeliminatdinstivacandsuntvizitatetoatenodurileadiacentelui.
Pentrugraful

05/20/16

37

4
6

5
7

varfurilevorfivizitateinordinea:12537648.

05/20/16

38

Algoritmulinpseudocodeste:
ExporareInAdincime(s)este
Vizitate<-{s}
*prelucreazainformatiadins
*introdusinstivaS
|cattimpS<>stiva_vidaexecuta
|v<-varfstivaS
|w<-urmatorulnodadiacentluiv
|||dacanuexistawatunci
|||*scoatevdinstiva
|||altfel
||||dacawnuapartineluiVizitateatunci
|||*aduagawlaVizitate
|||*prelucreazainformatiadinw
|||*introduwinstivaS
||-
|-

05/20/16

39

Pentruimplementaresefacurmatoareleprecizari:
-Seimplementeazastivaprintr-untabloudeintregisinucaostructuradinamica.Aceastasolutieesterigidasi
ineficienta,fiidaleasapemotivulsimplitatiidescrierii.Functiiledeaccessidemodificareutilizatesunt
similarecelordincazulgeneral.

-multimeaSesteimplementatacauntablou.
-sefolosestestilulprogramariidefensivecucaptareatuturorerorilorposibile
-sefaceparcurgereatuturornodurilorgrafului.Prelucrareafiecaruinodconstadoarinafisareaetichetelor
sale
/*stiva.h*/
#include"comune.h"
typedefintSTIVA[NmaxNoduri];

boolInitializareStivaI(STIVAS);
/*initializeazaostucturarezervata*/
boolIntroduceInStivaI(STIVAS,inte);
/*introduceunelementinstiva*/
boolExtrageDinStivaI(STIVAS,int*pe);
/*extrageunelementdinstiva*/
boolTestStivaGoalaI(STIVAS);
/*testeazadacasuntelementeinstiva*/
boolValoareDinVarfI(STIVAS,int*pe);
/*aflavaloareadinvarfulstivei*/

05/20/16

40

--

multimeaSesteimplementatacauntablou.
-- sefolosestestilulprogramariidefensivecucaptareatuturorerorilorposibile
-- sefaceparcurgereatuturornodurilorgrafului.Prelucrareafiecaruinodconstadoarinafisareaetichetelor
sale

/*stiva.c*/

#include "stiva.h"
int NrElem;
bool InitializareStivaI(STIVA S){
NrElem=0;
return True;
}
bool IntroduceInStivaI(STIVA S, int e){
if (NrElem<NmaxLegaturi){
S[NrElem]=e;
NrElem++;
return True;
}
return False;
}
05/20/16

41

bool ExtrageDinStivaI(STIVA S,int *pe){


if (NrElem>0){
*pe=S[NrElem-1];
NrElem--;
return True;
}
return False;
}
bool TestStivaGoalaI(STIVA S){
if (NrElem==0) return True;
return False;
}
bool ValoareDinVarfI(STIVA S, int *pe){
if (NrElem>0){
*pe=S[NrElem-1];
return True;
}
return False;
}

05/20/16

42

Parcurgereainadincime:

#include "graf.c"
#include "stiva.c"
#include <conio.h>
int Vizitate [NmaxNoduri];
bool ExplorareInAdancime (int s){
int j, v, w, nw, PrimaLegatura;
STIVA S;
InitializareStivaI(S);
Vizitate[s] = 1;
printf("vizitat nodul %d\n", s);
if (!AflaCap(s, &PrimaLegatura))
EROARE("Aflare prima legatura");
if (!IntroduceInStivaI(S,PrimaLegatura))
EROARE("Introducere in stiva");
while (! TestStivaGoalaI(S)){
if (!ExtrageDinStivaI(S, &w))
EROARE("Extragere din stiva");
if (!AflaNod(w, &nw))
EROARE("Aflare nod");
if (nw!=0){

05/20/16

43

if (!AflaLegaturaUrmatoare(w, &w))
EROARE("Aflare legatura urmatoare");
if (!IntroduceInStivaI(S, w))
EROARE("Introducere in stiva");
if (Vizitate[nw]==0){
Vizitate[nw] = 1;
printf("vizitat nodul %d\n", nw);
if (!AflaCap(nw, &PrimaLegatura))
EROARE("Aflare prima legatura");
if (!IntroduceInStivaI(S,PrimaLegatura))
EROARE("Introducere in stiva");
}
}
}
}

05/20/16

44

int main (){


int start;
clrscr();
CitesteGraf();
for (start=1; start<=NNoduri; start++) Vizitate[start]=0;
for (start=1; start<=NNoduri; start++)
if(Vizitate[start]==0){
printf("\nExplorare din %d\n", start);
if (!ExplorareInAdancime(start))
exit(EXIT_FAILURE);
}
printf("\nsfarsit explorare");
}

05/20/16

45

S-ar putea să vă placă și