You are on page 1of 7

Algoritmikë Grafet me peshë

Grafet me peshë
Grafet me peshë janë një nënbashkësi e grafeve. Tek grafet me peshë, ndryshe nga grafet pa
peshë, brinjët kanë vlera ose pesha të ndryshme.
Ka shumë probleme që trajtohen nëpërmjet grafeve me peshë. Brinjët e një rrjeti
rrugësh lidhen me vlera numerike si p.sh. kostoja e ndërtimit, koha që duhet për t’i përshkuar,
gjatësia, shpejtësia e lejuar, etj. Në këto kushte lind shpesh nevoja e gjetjes së shtegut më të
shkurtër në graf.
Struktura e të dhënave për grafet me peshë është e njëjtë me atë të parë për grafet në
përgjithësi.

typedef struct {
int w; /* kulmi fundor i brinjes */
int pesha; /* peshe e brinjes*/
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 i kulmeve te grafit */
int nbrinje; /* numri i brinjeve te grafit */
bool orientuar; /* indikator, graf i orientuar? */
} graf;

1. Pemët minimale të mbulimit

Pema e mbulimit të një grafi G= (V, E) është një nënbashkësi e brinjëve të grafit (E) e tillë që
mbulon (lidh) të gjitha kulmet e grafit dhe që nuk përmban cikle. Tek grafet me peshë
interesohemi veçanërisht për pemën minimale të mbulimit, d.m.th. pemën e mbulimit që
përmban brinjët me shumën më të vogël të mundshme të peshave.

Fig.1. Graf me peshë dhe pema minimale e mbulimit. Brinjët e pemës minimale paraqiten të theksuara.

Pemët e minimale të mbulimit janë ato që kërkojmë sa herë që duhet të lidhim kulme me
brinjë me vlerën më të vogël të mundshme. Sa herë që kërkojmë të gjejmë numrin më të vogël
të brinjëve që lidhin një bashkësi kulmesh, përftojmë pemë. Por, pema minimale e mbulimit
është grafi më i vogël i lidhur nga pikëpamja e peshës së brinjëve. Pema minimale e mbulimit
e minimizon gjatësinë e të gjitha pemëve të mbulimit. Megjithatë, në një graf mund të ketë
më shumë sesa një pemë minimale mbulimi. Në grafet pa peshë, pemët e mbulimit mund të

B.Bimbari -1-
Algoritmikë Grafet me peshë

gjenden duke zbatuar algoritmin e bredhjes në gjerësi, ose të bredhjes në thellësi. Për grafet
me peshë, ekzistojnë dy algoritme që gjejnë pemët minimale të mbulimit. Ata janë algoritmi
Prim dhe algoritmi Kruskal.

1.1 Algoritmi Prim


Algoritmi Prim fillon kontrollin për pemën minimale të mbulimit nga një kulm çfarëdo në graf
dhe në çdo hap të tij zgjedh nga një brinjë që e lidh me një kulm të pambuluar ende. Brinja që
zgjedh algoritmi për të shtuar në pemë është brinja me peshën më të vogël që lidh ndonjë
kulm të pambuluar.

Algoritmi Prim (Graf G)


1. Zgjidh një kulm të çfarëdoshëm k për të filluar krijimin
e pemës
2. Për sa kohë që ka kulme të pambuluar (pra që nuk janë
akoma në pemë)
3. Zgjidh brinjën ndërmjet një kulmi të pemës dhe një
kulmi jo të pemës me peshë minimale
4. Shto brinjën e zgjedhur dhe kulmin tek pema Pprim

Algoritmi Prim krijon një pemë mbulimi sepse nga mënyra sesi ai i zgjedh kulmet dhe brinjët
për t’u shtuar në pemë, nuk ka mundësi që të krijohen cikle.
Nga ana tjetër, pema e krijuar është në fakt pema minimale e mbulimit. Le të supozojmë të
kundërtën, pra që pema e mbulimit që ndërton algoritmi Prim nuk është ajo minimale. Kjo do
të thotë që në graf ekziston një tjetër pemë minimale. M.q.s algoritmi Prim e ndërton pemën
në mënyrë inkrementale atëherë në ndonjë hap algoritmi ka zgjedhur një brinjë të gabuar. Le
të themi që në një hap algoritmi shton në pemën Pprim brinjën (x, y) e cila çon në krijimin e
pemës së mbulimit jo minimale. Kjo do të thotë që në pemë duhet të ekzistojë ndonjë shteg s
nga x në y i cili ndodhet në pemën Pmin. Ky shteg duhet të përmbajë ndonjë brinjë (v1, v2) ku v1
ndodhet në pemën Pprim, ndërsa v2 jo. Brinja (v1, v2) duhet ta ketë peshën të paktën sa brinja
(x, y), sepse në të kundërt algoritmi Prim do ta kishte zgjedhur përpara brinjës (x, y). Shtimi i
brinjës (x, y) në pemën Pmin dhe heqja e brinjës (v1, v2) nuk do të çonte në krijimin e një peme
më të mirë mbulimi. Kjo do të thotë që algoritmi Prim nuk e ka zgjedhur gabimisht brinjën (x,
y). Pra, duke u nisur nga e kundërta, tregojmë që algoritmi Prim ndërton pemën minimale të
mbulimit të grafit.

Implementimi i algoritmit Prim është si më poshtë:

void Prim(graph *g, int kFillimi)


{
int i; /* index */
brinje *p; /* shenjues i perkohshem */
bool nePeme[MAXV+1]; /* eshte shtuar kulmi ne peme? */
int distance[MAXV+1]; /* kostoja e shtimit te kulmit */
int v; /* kulmi i rradhes per t’u procesuar */
int w; /* kulmi tjeter kandidat per t’u shtuar ne peme */
int pesha; /* pasha e brinjes */
int dist; /* distance me e mire nga fillimi deri tani */

for (i=1; i<=g->nkulmesh; i++) {


nePeme[i] = FALSE;

B.Bimbari -2-
Algoritmikë Grafet me peshë

distance[i] = MAXINT;
prindi[i] = -1;
}

distance[kFillimi] = 0;
v = kFillimi;

while (nePeme[v] == FALSE) {


nePeme[v] = TRUE;
p = g->brinjet[v];
while (p != NULL) {
w = p->y;
pesha = p->pesha;
if((distance[w] > pesha) &&(nePeme[w] == FALSE)) {
distance[w] = pesha;
prindi[w] = v;
}
p = p->pas;
}
v = 1;
dist = MAXINT;

for (i=1; i<=g->nkulmesh; i++)


if((nePeme[i] == FALSE) && (dist > distance[i])) {
dist = distance[i];
v = i;
}
}
}

Në implementimin më lart, çdo kulmi i caktohet një variabël boolean për të treguar nëse kulmi
është shtuar në pemën Pprim. Kjo realizohet nga tabela nePeme. Në implementimin më lart
ruhet edhe brinja me peshën më të vogël që lidh çdo kulm që nuk është shtuar në pemë me
pemën. Gjatë çdo cikli shtohet në pemë brinja me peshën më të vogël. Pas çdo shtimi duhet
të modifikojmë koston e arritjes tek kulmet e pashtuar në pemë. Megjithatë, m.q.s. ndryshimi
i vetëm në pemë është shtimi i një kulmi, të gjitha ndryshimet e mundshme duhet të bëhen
tek brinjët dalëse të kulmit që u shtua.
Kompleksiteti i algoritmit Prim, implementuar si me lart, është O(n2), ku n është numri
i kulmeve të grafit.
Rezultatet e çdo hapi të ekzekutimit të algoritmit Prim për grafin e paraqitur në
figurën 1 janë si në figurën 2.
Në përfundim të ekzekutimit të algoritmit Prim, vlerat e tabelës prindi do të
tregojnë kulmet e pemës dhe paraardhësin e secilit kulm, ndërsa vlerat e tabelës distancë
do të tregojnë gjatësinë e shtigjeve.

B.Bimbari -3-
Algoritmikë Grafet me peshë

Fig.2. Rezultatet e hapave të ekzekutimit të algoritmit Prim për grafin e figurës 1.

1.2 Algoritmi Kruskal

Algoritmi Kruskal gjen pemët minimale të mbulimit të grafeve dhe është më efiçent në grafet
e rrallë.
Algoritmi Kruskal ndërton komponente të lidhura kulmesh, duke përfunduar në
pemën e mbulimit minimal. Fillimisht, çdo kulm formon një komponente më vete në të pemës
së ardhshme. Algoritmi konsideron në mënyrë të përsëritur brinjën me peshë më të vogël dhe
kontrollon nëse dy kulmet e saj ndodhen në të njëjtën komponente të lidhur. N.q.s po, kjo
brinjë nuk shtohet, sepse shtimi i saj do të krijonte cikël në pemë. N.q.s. dy kulmet janë në
komponente të ndryshme, atëhere shtohet brinja dhe dy komponentet e ndara bashkohen në
një. M.q.s. çdo komponent i lidhur është gjithmonë një pemë, nuk kontrollohet për cikle.

B.Bimbari -4-
Algoritmikë Grafet me peshë

Algoritmi Kruskal (Graf G)


1. Shto brinjët në një rradhë, të renditura sipas peshës
2. nr = 0
3. për sa kohë që (nr < n – 1) bëj
4. merr brinjën tjetër (v, w)
5. n.q.s. komponentja (v) ≠ komponentja (w)
6. shto brinjen ne PemenKruskal
7. bashko komponenten (v) me komponenten (w)

Algoritmi trajton n-1 brinjë dhe nuk krijon cikle, kështu që ai krijon një pemë mbulimi për çdo
graf të lidhur. N.q.s. kjo pemë nuk do të ishte pema minimale e mbulimit, atëherë gjatë
trajtimit të brinjëve algoritmi zgjedh një brinjë (x, y) që e pengon pemën PemëKruskal të jetë
minimale. Shtimi i brinjës (x, y) në Pemëmin do të krijonte cikël me shtegun nga x tek y. M.q.s.
x dhe y ishin në komponente të ndryshme në momentin e shtimit të brinjës (x, y), të paktën
një brinjë (p.sh. (v1, v2)) në shtegun x, y do të kishte qenë trajtuar nga algoritmi pas shtimit të
brinjës (x, y). Kjo do të thotë që pasha e brinjës (v1, v2) ≥ pesha e brinjës (x, y), kështu që
zëvendësimi i këtyre dy brinjëve do të prodhonte një pemë jo më të mire sesa Pemamin. Pra,
algoritmi e ka zgjedhur saktë brinjën (x, y). Algoritmi është korrekt.
Koha e renditjes së m brinjëve ka varësinë O(mlogm) nga numri i brinjëve të grafit. Cikli
for realizohet në m përsëritje, gjatë cdo përsëritjeje kontrollohet a janë të lidhura dy pemë
dhe një brinjë. Ky kontroll mund të realizohet nëpërmjet bredhjes në gjerësi, ose bredhjes në
thellësi dhe në një graf të rrallë, me të shumtën m brinjë dhe n kulme, algoritmi do të ketë
kompleksitetin O(mn).

2. Rruga më e shkurtër

Shteg ose rrugë nga kulmi s tek kulmi t është sekuenca e brinjëve që lidh dy kulmet. Ndërmjet
dy kulmeve mund të ekzistojnë shumë rrugë, prandaj edhe lind problemi i gjetjes së rrugës
më të shkurtër ndërmjet tyre.
Rruga më e shkurtër ndërmjet kulmit s dhe t në një graf pa peshë mund të gjendet
duke përdorur bredhjen në gjerësi, duke filluar nga kulmi s. Por, bredhja në gjerësi nuk arrin
të gjejë rrugën më të shkurtër mes dy kulmeve në një graf me peshë. Rruga më e shkurtër në
grafet me peshë mund të përdorë shumë brinjë.

2.1 Algoritmi Dijkstra

Algoritmi Dijkstra gjen rrugën më të shkurtër ndërmjet kulmeve në një graf me peshë. Kur
jepet një kulm fillimi s, ai gjen rrugën më të shkurtër nga kulmi s tek çdo kulm tjetër në graf,
përfshirë dhe kulmin destinacion t.
Supozojmë që rruga më e shkurtër nga s tek t kalon nga një kulm x. Kjo rrugë do të
kalojë nëpër rrugën më të shkurtër nga s tek x, sepse nëse nuk do të ishte kështu ne mund ta
shkurtonim rrugën nga s tek t duke kaluar nëpër rrugën e x. Prandaj, duhet të llogaritet rruga
më e shkurtër nga kulmi s tek kulmi x përpara sesa të gjendet shtegu nga s tek t.
Algoritmi Dijkstra zhvillohet në disa cikle dhe në çdo cikël vendoset se cila është rruga
më e shkurtër nga s tek ndonjë kulm i ri. Kulmi x është kulm i tillë që minimizon vlerën dist(s,

B.Bimbari -5-
Algoritmikë Grafet me peshë

vi) + w(vi, x) për kulmet 1≤ i ≤n e përfshira në shteg. w(i, j) është pesha e brinjës (i,j), ndërsa
dist(i, j) është gjatësia e shtegut më të shkurtër ndërmjet kulmit i dhe j.
Rruga më e shkurtër nga kulmi s tek ai vetë është dist(s, s) = 0 (me kusht që në graf të
mos ketë brinjë me peshë negative). N.q.s. brinja (s, y) është brinja me peshë më të vogël që
del nga kulmi s, atëhere dist(s, y) = w(s, y). Pasi është gjetur rruga më e shkurtër tek kulmi x,
kontrollohen të gjithë brinjët dalëse nga kulmi x për të parë nëse nëpërmjet x ka ndonjë shteg
më të mire nga s tek ndonjë kulm i panjohur. Algoritmi Dijkstra është si më poshtë:

RrugaMeShkurter-Dijkstra(G, s, t)

Kulme_te_njohur = {s}
for i = 1 to n
dist[i] = ∞
foreach brinje (s, v)
dist[v] = w(s, v)
i_fundit = s
while (i_fundit <> t)
zgjidh vtjetri kulmin e panjohur qe minimizon dist[v]
foreach brinje (vtjetri, x)
dist[x] = min[dist[x], dist[vtjetri] + w(vtjetri, x)]
i_fundit = vtjetri
kulme_te_njohur = kulme_te_njohur ∪ {vtjetri}

Implementimi i algoritmit Dijkstra është si më poshtë:

dijkstra(graph *g, int fillimi)


{
int i;
brinje *p; /* shenjues i perkohshem */
bool nePeme[MAXV+1]; /* eshte shtuar kulmi ne peme? */
int distance[MAXV+1]; /* distance e kulmit nga fillimi */
int v; /* kulmi qe po trajtohet */
int w; /* kulmi tjeter kandidat per t’u trajtuar */
int pesha; /* pasha e brinjes */
int dist; /* distance me e mire nga fillimi deri tani*/

for (i=1; i<=g->nKulmesh; i++) {


nePeme[i] = FALSE;
distance[i] = MAXINT;
prindi[i] = -1;
}

distance[fillimi] = 0;
v = fillimi;
while (nePeme[v] == FALSE) {
nePeme[v] = TRUE;
p = g->brinje[v];
while (p != NULL) {
w = p->y;
pesha = p->pesha;
if (distance[w] > (distance[v]+pesha)) {
distance[w] = distance[v]+pesha;
prindi[w] = v;
}
p = p->pas;
}

B.Bimbari -6-
Algoritmikë Grafet me peshë

v = 1;
dist = MAXINT;
for (i=1; i<=g->nKulmesh; i++)
if ((nePeme[i] == FALSE) && (dist > distance[i])) {
dist = distance[i];
v = i;
}
}
}

Kompleksiteti i algoritmit Dijkstra, i implementuar si më lart është O(n2).

Gjatësia e rrugës më të shkurtër nga kulmi s tek kulmi t është vlera distance[t]. Për të
gjetur shtegun (pra sekuencën e kulmeve pjesë e rrugës më të shkurtër) duhet të lexohet
duke nisur nga fundi tabela prindi.

B.Bimbari -7-

You might also like