Documente Academic
Documente Profesional
Documente Cultură
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
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
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
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
05/20/16
45