You are on page 1of 9

Grafet

1. Grafet e orinetuar dhe te paorientuar


Grafi eshte nje strukture matematikore qe perbehet nga nje bashkesi kulmesh dhe
brinjesh qe lidhin keto kulme. Formalisht brinjet trajtohen si cifte kulmesh, nje brinje
(v, w) lidh kulmin v me kulmin w. Formalisht:

V eshte bashkesia e kulmeve

E eshte nenbashkesi e V x V

Shkruajme G = (V, E) per te treguar qe G eshte nje graf me bashkesi kulmesh


bashkesine V dhe bashkesi brinjesh bashkesine E. Grafi G = (V, E) eshte i
paorientuar atehere dhe vetem atehere kur kur nqs per te gjitha kulmet v, w V, (v,
w) E kemi (w, v) E. Nga perkufizimi duket qe grafet e paorientuara jane raste te
vecanta te grafeve te orientuar.
Bashkesia V dhe rrjedhimisht edhe bashkesia E jane te pafundme. Grafe te tilla
gjejne perdorim ne shume fusha, megjithate do te trajtojme vetem bashkesi te
fundme V. Mqs E eshte nenbashkesi e VxV atehere edhe E eshte e fundme.
Figura me poshte paraqet nje graf te orientuar me kulme dhe brinje te percaktuara
nga bashkesite:
V = {0, 1, 2, 3, 4, 5, 6} dhe
E = {(0, 2), (0, 4), (0, 5), (1, 0), (2, 1), (2, 5), (3, 1), (3, 6), (4, 0), (4, 5), (6, 3), (6,
5)}

Fig.1 Graf i orientuar


Nqs v V eshte nje kulm ne nje graf te orientuar G=(V, E) atehere:

Rendi hyres in(v) i kulmit v eshte numri i brinjeve hyrese tek v, dmth numri i
brinjeve te trajtes (v, u).

Rendi dales out(v) i kulmit v eshte numri i brinjeve dalese nga v, dmth numri i
brinjeve (v, u).

Ne nje graf te paorientuar, rendi i nje kulmi v eshte numri i brinjeve e E per te cilat
njeri kulm eshte v. Dy kulme jane fqinje nese ka nje brinje qe i lidh ato.
Grafet jane modele matematikore qe mund te perdoren ne probleme te ndryshme.
Disa nga perdorimet e grafeve jane:
Hartat e linjave ajrore. Kulmet perfaqesojne aeroporte dhe nga kulmi A tek kulmi B
ka nje brinje nese ka nje fluturim direkt nga nje aeroport i A tek nje aeroport i B.
Qarqet elektrike. Kulmet perfaqesojne dioda, tranzistore, celesa, etj dhe brinjet
perfaqesojne telat qe i lidhin ato.
Rrjetat kompjuterike. Kulmet perfaqesojne kompjutera dhe brinjet perfaqesojne
lidhjet e rrjetit ndermjet tyre.
Worl Wide Web. Kulmet jane faqet e internetit ndersa brinjet jane hyperlinks qe
lidhin faqet me njera tjetren.

2. Strukturat e te dhenave per grafet


Le te jete G=(V, E) nje graf me n kulme. Do ti emertojme kulmet e grafit me numra
nga 0, 1, ..., n-1 ne nje menyre te zakonshme.

Paraqitja e grafit me matricen e fqinjesise


Matrica e fqinjesise per grafin G eshte nje matrice nxn A = (aij)0i, jn-1, ku aij = 1 nqs
ka nje brinje nga kulmi i tek kulmi j dhe 0 perndryshe.
Psh, matrica e fqinjesise per grafin e paraqitur ne Fig.1 eshte :

Fig.2

Matrica e fqinjesise varet nga menyra e emertimit te kulmeve te grafit. Matrica e


fqinjesise qe paraqet grafin eshte nje tabele dy dimensionale booleane, ku vlera
TRUE (ose 1) tregon qe ndermjet kulmit paraqitur nga rreshti perkates dhe kulmit
paraqitur nga shtylla perkatese ka nje brinje qe i lidh (pra jane fqinje). Vlera FALSE

(ose 0) tregon qe ndermjet kulmeve nuk ka nje brinje qe i lidh (pra nuk jane fqinje).
Mund te ndodhe qe ne vend te vlerave 1 dhe 0 te kete numra (rastet e grafeve me
peshe). Perparesia kryesore e paraqitjes se grafeve me matrice fqinjesie eshte se
per te gjithe kulmet v dhe w mund te kontrollohet ne kohe konstante nese ato jane
fqinje ose jo (pra nese ka nje brinje qe i lidh apo jo).
Cmimi qe paguhet per aksesin e shpejte te shpjeguar me larte eshte kujtesa. Le te
jete m numri i brinjeve te grafit (m mund te jete te shumten n2).Nqs m eshte shume
afer vleres n2 atehere grafi quhet i dendur, ndersa nqs ajo eshte shume me e vogel
sesa n2 grafi quhet i rralle. Ruajtja e grafit do te kerkonte te pakten n+m vende ne
kujtese, nderkohe perdorimi i matricave te fqinjesise perdor n2 vende. Kjo vlere
eshte shume me e madhe sesa n+m sidomos per grafet e rralle (nje pjese e madhe
e elementeve te matrices ka vlere 0). Algoritmet qe punojne me grafet, duhet te
inspektojne te gjitha brinjet e grafit te pakten njehere dhe, ne paraqitjen e grafit me
matrice fqinjesie keto algoritme trajtonin cdo element te matrices te pakten njehere
(per tu siguruar qe jane kontrolluar te gjitha brinjet). Algoritmet do te kerkonin
O(n2) kohe per tu ekzektuar.

Paraqitja e grafit me listen e fqinjesise

Kur grafi paraqitet nepermjet listes se fqinjesise, perdoret nje tabele me n elemente,
ku n eshte numri i kulmeve te grafit. Cdo element i vektorit (qe i korrespondon nje
kulmi v) eshte nje liste e lidhur e cila permban te gjithe kulmet w qe lidhen me
kulmin v nepermjet nje brinje. Elementet e listes do te jene emertimet(numra, emra,
etj, ne varesi te menyres se zgjedhur per emertimin e kulmeve) e kulmeve fqinje.
Nuk ka rendesi renditja e kulmeve w ne listen e lidhur, pra nuk ka rendesi renditja e
brinjeve qe ato paraqesin. Kjo gje duhet te kihet parasysh edhe ne algoritmet qe
punojne me grafet e paraqitura me keto struktura.
Grafi i paraqitur ne figuren 1 paraqitet nepermjet listave te fqinjesise si me poshte:

Fig.3

Per grafe te rralle paraqitja me liste fqinjesie eshte me eficente sesa paraqitja me
matrica, persa i perket hapesires. Per nje graf me n kulme dhe m brinje hapesira qe
kerkohet eshte (m+n), qe mund te jete shume me pak sesa (n 2) hapesira e
kerkuar kur grafi paraqitet me matrice fqinjesie. Nga ana tjeter, per te gjetur nese
ka nje brinje ndermjet dy kulmeve v dhe w duhet te bridhet e gjithe lista e
fqinjesise, e cila mund te kete te shumten n elemente. Prandaj, testimi i kushtit te
fqinjesise kerkon (n) hapa per paraqitjen me lista fqinjesie, perkundrejt (1)
hapave ne rastin e matrices se fqinjesise.
Per grafin e paraqitur me liste fqinjesie percaktohet struktura si me poshte :
typedef struct {
}

typedef struct {
int w;

/* kulmi fundor I brinjes */

int pesha;

/* peshe e brinjes nese ka */

struct brinje *pas;

/* brinja pasardhese ne liste */

} brinje;

//MAXK konstante qe tregon numrin maximal te kulmeve


typedef struct {
brinje *brinjet[MAXK+1];

/* tabela me listen e fqinjesise */

int rendi[MAXK+1];

/* rendi I cdo kulmi */

int nkulmesh;

/* numri kulmeve te grafit */

int nbrinje;

/* numri brinjeve te grafit */

bool nbrinje;

/* indicator, graf I orientuar? */

} graf;

Ne strukturat me lart, nje brinje (v,w) e orientuar paraqitet nepermjet nje brinje w
ne listen e fqinjesise se v. Nje brinje e paorientuar do te shfaqej dy here ne nje graf

me kete strukture, sepse do te ishte njehere ne listen e fqinjesise se v dhe njehere


ne listen e fqinjesise se w.
Inicializimi i nje grafi bosh, paraqitur si me lart do te ishte :

inicializo_graf(graf *g, bool orientuar)


{
int i; g -> nkulmesh = 0;
g -> nbrinje = 0;
g -> nbrinje = nbrinje;
for (i=1; i<=MAXK; i++) g-> rendi[i] = 0;
for (i=1; i<=MAXK; i++) g-> brinjet[i] = NULL;
}

Shtimi i nje brinje ne graf mund te realizohet nepermjet algoritmit shto_brinje me


poshte :
shto_brinje (graf *g, int v, int w, bool orientuar)
{
brinje *p;
p = malloc(sizeof(brinje)); p->pesha = NULL;
p->w = w;
p->pas = g->brinjet[v];
g-> brinjet[v] = p; /* shtim ne fillim te listes */
g->rendi[v] ++;
if (orientuar == FALSE) shto_brinje (g,w,v,TRUE);
else
g->nbrinje ++;

Afishimi i nje grafi mund te realizohet nepermjet algoritmit printo_graf me poshte:

printo_graf(graf *g)
{
int i;
brinje *p;
for (i=1; i<=g->nkulmesh; i++) {
printf("%d: ",i);
p = g->brinjet[i];
while (p != NULL) {
printf(" %d",p->w);
p = p->pas;
}
printf("\n");
}
}

Bredhja e grafeve

Pjesa me e madhe e algoritmeve te bredhjes se grafeve trajtojne cdo kulm dhe


brinje sipas nje rregulli te caktuar. Ne kete menyre algoritmet japin nje bredhje te
grafit, dmth nje strategji per te vizituar kulmet dhe brinjet sipas nje rregulli te
pershtatshem.
Dy nga menyrat me te perhapura per bredhjen e grafit jane bredhja ne gjeresi
(breadth-first search) dhe bredhja ne thellesi (depth-first search). Te dyja fillojne nga
nje kulm v dhe vizitojne te gjithe kulmet e arritshme nga v (pra te gjithe fqinjet e
tij). Nqs ka kulme qe mbeten te pavizituara, dmth ka kulme qe nuk jane te arritshme
nga v, atehere e vetmja menyre qe ato te mund te listohen eshte qe kerkimi te

zgjedhe nje kulm te ri te pavizituar v dhe te vizitoje te gjitha kulmet e arritshme


prej tij. Ky proces duhet te perseritet deri sa te jene vizituar te gjitha kulmet.

Bredhja ne gjeresi
Bredhja ne gjeresi qe fillon tek nje kulm v, trajton ne fillim v dhe me pas te gjithe
fqinjet e tij (dmth te gjithe kulmet w te tilla qe nga v tek w ka nje brinje), pastaj te
gjithe fqinjet e fqinjeve qe nuk jane vizituar me pare, pastaj te gjithe fqinjet e
fqinjeve te fqinjeve, e keshtu me rradhe. Psh nje bredhje ne gjeresi e grafit te
paraqitur ne figuren 1, duke filluar nga kulmi 0, eshte 0, 2, 5, 4, 1. Ne fillim trajtohet
kulmi 0, pastaj fqinjet e tij 2, 5, 5. Me pas trajtohen fqinjet e kulmit 2 qe jane 1 dhe
5. Mqs 5 eshte trajtuar nje here me pare, ne liste shtohet vetem 1. Te gjithe fqinjet e
5, 4 dhe 1 jane vizituar, keshtu qe lista permban te gjithe kulmet e arritshem nga 0.
Ka edhe menyra te tjera sesi mund te zgjidhen kulmet qe trajtohen duke u nisur nga
kulmi 0. Nqs kulmet fqinje qe do te vizitohen zgjidhen ne rend numerik, atehere
bredhja ne gjeresi duke filluar nga 0 do te jepte 0, 2, 4, 5, 1. Kulmet 3 dhe 6 nuk
jane te arritshme nga kulmi 0, prandaj per ti vizituar ata duhet te fillohet nje
bredhje tjeter ne gjeresi, psh nga kulmi 3.
Bredhja dhe sekuenca qe ajo prodhon varet shume nga kulmi ne te cilin
fillohet. Psh nqs bredhjen e fillojme ne kulmin 6, atehere te gjitha kulmet jane te
arritshme dhe trajtohen ne nje hap te gjitha. Sekuenca qe do merret eshte 6, 5, 3, 1,
0, 2, 4. Renditje tjeter qe mund te gjenerohet eshte 6, 3, 5, 1, 0, 2, 4 dhe 6, 5, 3, 1,
0, 4, 2 ose 6, 3, 5, 1, 0, 4, 2.
Ne grafet e pa orientuara, numri i rezultateve te ndryshme te bredhjes ne
gjeresi eshte i pavarur nga zgjedhja e kulmit te fillimit.
Gjate bredhjes ne gjeresi te grafit, duhet te ruajme kulmet qe jane vizituar
ne deri ne ate moment dhe kulmet qe jane trajtuar plotesisht deri ne ate moment
(dmth kulmet per te cilet jane vizituar te gjithe fqinjet e tyre). Tabela booleane
vizituar ka aq elemente sa eshte numri i kulmeve te grafit. Cdo element ka vleren
TRUE nqs kulmi te cilit ai i korrespondon eshte vizituar. Kulmet qe jane vizituar, por
qe nuk jane trajtuar plotesisht ruhen ne nje rradhe Rradhe. Kjo garanton qe kulmet
te trajtohen ne rendin e duhur kulmet qe vizitohen me pare do te trajtohen me
pare. Implementimi i algoritmit te bredhjes ne gjeresi jepet me poshte si pseudokod.

Algorithm bredhje_ne_gjeresi(G)
1. Inicializo tabelen booleane vizituar me te gjitha vlerat FALSE
2. Inicializo Rradhen Q
3. per te gjitha v V bej

4.
5.

nqs vizituar[v] = FALSE atehere


bredhje_ne_gjeresi_nga_kulmi(G, v)

Algorithm bredhje_ne_gjeresi_nga_kulmi (G, v)


1. vizituar[v] = TRUE
2. Q.futNeRradhe(v)
3. per sa kohe Q.eshteBosh() bej
4.

v Q.hiqNgaRradha()

5.

per te gjithe w fqinje me v me

6.

nqs vizituar[w] = FALSE atehere

7.

vizituar[w] = TRUE

8.

Q.futNeRradhe(w)

Algoritmi kryesor bredhje_ne_gjeresi inicializon tabelen vizituar dhe rradhen dhe me


pas bredh te gjitha kulmet. Per secilin kulm qe nuk eshte shenjuar si i vizituar, ai
inicion nje bredhje_ne_gjeresi_nga_kulmi. Algoritmi bredhje_ne_gjeresi_nga_kulmi
viziton te gjitha kulmet e arritshme nga kulmi fillestar sic u pershkrua me lart. Cikli
ne rreshtat 5-8 mund te implementohet duke perdorur bredhur listen e fqinjesise te
kulmit v.
Bredhja ne thellesi
Bredhja ne thellesi qe fillon nga nje kulm v, viziton ne fillim v, pastaj ndonje fqinj w
te v, pastaj ndonje fqinje x te w qe nuk eshte vizituar me pare, e keshtu me rradhe.
Kur algoritmi ngec dmth i ka trajtuar te gjithe kulmet fqinje si me siper, kthehet dhe
gjen kulmin e pare te vizituar qe ka nje fqinje te vizituar. Ai vazhdon me bredhjen
deri sa ti duhet kthehet perseri mbrapa. Ne kete menyre, algoritmi do te mbuloje
te gjitha kulmet e arritshme nga v. Me pas fillon nje bredhje tjeter ne thellesi. Kjo
bredhje fillon nga ndonje kulm qe nuk eshte e arritshme nga v dhe kjo perseritet
derisa te gjitha kulmet te jene vizituar.
Per grafin me poshte, nje bredhje ne thellesi qe fillon nga kulmi 0 do te jepte
sekuencen

Fig. 4

0, 2, 1, 5, 4. Pasi jane vizituar kulmet 0, 2 dhe 1, algoritmi kthehet tek kulmi 0 dhe
viziton 4. Bredhja ne thellesi qe fillon tek 0 mund ti vizitoje kulmet edhe ne rendin
0, 4, 5, 2, 1 ose 0, 5, 4, 2, 1 ose 0, 2, 5, 1, 4. Ashtu si dhe tek bredhja ne gjeresi,
sekuenca e kulmeve qe jep algoritmi varet nga radha ne te cilen trajtohen kulmet.
Bredhja ne thellesi mund te implementohet ne menyre te ngjashme me
bredhjen ne thellesi, duke perdorur nje stive ne vend te rradhes.

You might also like