Download as pdf or txt
Download as pdf or txt
You are on page 1of 34

Visoka škola za informacijske tehnologije

Strukture podataka i algoritmi

Minimalno razapinjuće stablo i


minimalne udaljenosti u grafu
pbrodjanac@vsite.hr

Predrag Brođanac
Što je graf?

• skup vrhova (V) i bridova (E)


• brid povezuje dva vrha
• neke vrste grafova:
– usmjereni i neusmjereni grafovi
– težinski

Strukture podataka i algoritmi 2


Težinski grafovi
7
0 1

5
• bridovi imaju težine (udaljenosti, 2
12 9
10
cijene,…)
• težinska matrica grafa
3

– na mjestu i, j piše težina brida od čvora i do


čvora j, ako brid ne postoji piše beskonačno
• težinska lista
– osim oznake susjednih čvorova čuvaju se i
udaljenosti do čvorova

Strukture podataka i algoritmi 3


Primjer 1

• za graf na slici odredimo: 0 ∞ 6 ∞ ∞


∞ 0 ∞ 5 7
– težinsku matricu ∞ ∞ 0 10 ∞
∞ ∞ 10 0 8
– težinsku listu ∞ ∞ ∞ ∞ 0
0 0 2 6
1
7
1 3 5 4 7
6 5 4
2 3 10
8
2 3 3 2 10 4 8
10
4

Strukture podataka i algoritmi 4


Minimalno razapinjuće stablo

• za zadani neusmjereni graf 𝐺 = (𝑉, 𝐸) želimo


pronaći aciklički podskup bridova 𝑇 ⊆ 𝐸 takav 0
7
1
da svi vrhovi budu povezani te da ukupna težina5
svih bridova u T bude minimalna 2
12 9

• T nema ciklusa – razapinjuće stablo 10

• ukupni zbroj težina bridova u T je minimalan – 3

minimalno razapinjuće stablo 7


0 1
• algotimi 5

– Primov 2
9

– Kruskalov
3

Strukture podataka i algoritmi 5


Primov algoritam

• skup obiđenih i skup neobiđenih čvorova


• u svakom koraku se skupu obiđenih čvorova
dodaje vrh koji je najbliži nekom od
obiđenih čvorova
• pohlepni (greedy)
3
0
3
3 5
4
2 4
4 3
2 2 4

Strukture podataka i algoritmi 6


Primov algoritam
najkraći brid
čvor prethodnik
3 do čvora
0
3
3
5
0 0 -1
4
2 4 1 ∞ -1
4 3
2 2 4 2 ∞ -1
1 3 ∞ -1
4 ∞ -1
5 ∞ -1

Strukture podataka i algoritmi 7


Primov algoritam
najkraći brid
čvor prethodnik
3 do čvora
0
3
3
5
0 0 -1
4
2 4 1 4 0
4 3
2 2 4 2 4 0
1 3 ∞ -1
4 ∞ -1
5 ∞ -1

Strukture podataka i algoritmi 8


Primov algoritam
najkraći brid
čvor prethodnik
3 do čvora
0
3
3
5
0 0 -1
4
2 4 1 4 0
4 3
2 2 4 2 2 1
1 3 ∞ -1
4 ∞ -1
5 ∞ -1

Strukture podataka i algoritmi 9


Primov algoritam
najkraći brid
čvor prethodnik
3 do čvora
0
3
3
5
0 0 -1
4
2 4 1 4 0
4 3
2 2 4 2 2 1
1 3 ∞ -1
4 ∞ -1
5 ∞ -1

Strukture podataka i algoritmi 10


Primov algoritam
najkraći brid
čvor prethodnik
3 do čvora
0
3
3
5
0 0 -1
4
2 4 1 4 0
4 3
2 2 4 2 2 1
1 3 3 2
4 2 2
5 4 2

Strukture podataka i algoritmi 11


Primov algoritam
najkraći brid
čvor prethodnik
3 do čvora
0
3
3
5
0 0 -1
4
2 4 1 4 0
4 3
2 2 4 2 2 1
1 3 3 2
4 2 2
5 3 3

Strukture podataka i algoritmi 12


Primov algoritam
najkraći brid
čvor prethodnik
3 do čvora
0
3
3
5
0 0 -1
4
2 4 1 4 0
4 3
2 2 4 2 2 1
1 3 3 2
4 2 2
5 3 3

Strukture podataka i algoritmi 13


Primov algoritam
najkraći brid
čvor prethodnik
3 do čvora
0
3
3
5
0 0 -1
4
2 4 1 4 0
4 3
2 2 4 2 2 1
1 3 3 2
4 2 2
5 3 3

Strukture podataka i algoritmi 14


Primov algoritam – implementacija
def prim(a):
d = [float('inf')] * len(a)
p = [-1] * len(a)
d[0] = 0
done = []
while len(done) < len(a):
mini = 0
minv = float('inf')
for t in range(len(d)):
if not t in done and d[t] < minv:
mini = t
minv = d[t]
done.append(mini)
for v in range(len(a)):
if a[mini][v] < d[v]:
d[v] = a[mini][v]
p[v] = mini
return done

𝑂 𝐸 𝑙𝑜𝑔 𝑉
Strukture podataka i algoritmi 15
Kruskalov algoritam

• gradi se šuma
• u svakom koraku uzima najkraći brid
vodeći računa da se ne napravi ciklus
• pohlepni (greedy)
3
0
3
3 5
4
2 4
4 3
2 2 4

Strukture podataka i algoritmi 16


Kruskalov algoritam
Brid Duljina
3
0
3
5
1-2 2
3
4
2 4 2-4 2
4 3
2 2 4 2-3 3
1 3-4 3
4-5 3
0-1 4
0-2 4
2-5 4

skupovi vrhova: {0}, {1}, {2}, {3}, {4}, {5}

Strukture podataka i algoritmi 17


Kruskalov algoritam
Brid Duljina
3
0
3
5
1-2 2
3
4
2 4 2-4 2
4 3
2 2 4 2-3 3
1 3-5 3
4-5 3
0-1 4
0-2 4
2-5 4

skupovi vrhova: {0}, {1, 2}, {3}, {4}, {5}

Strukture podataka i algoritmi 18


Kruskalov algoritam
Brid Duljina
3
0
3
5
1-2 2
3
4
2 4 2-4 2
4 3
2 2 4 2-3 3
1 3-5 3
4-5 3
0-1 4
0-2 4
2-5 4

skupovi vrhova: {0}, {1, 2, 4}, {3}, {5}

Strukture podataka i algoritmi 19


Kruskalov algoritam
Brid Duljina
3
0
3
5
1-2 2
3
4
2 4 2-4 2
4 3
2 2 4 2-3 3
1 3-5 3
4-5 3
0-1 4
0-2 4
2-5 4

skupovi vrhova: {0}, {1, 2, 4, 3}, {5}

Strukture podataka i algoritmi 20


Kruskalov algoritam
Brid Duljina
3
0
3
5
1-2 2
3
4
2 4 2-4 2
4 3
2 2 4 2-3 3
1 3-5 3
4-5 3
0-1 4
0-2 4
2-5 4

skupovi vrhova: {0}, {1, 2, 4, 3, 5}

Strukture podataka i algoritmi 21


Kruskalov algoritam
Brid Duljina
3
0
3
5
1-2 2
3
4
2 4 2-4 2
4 3
2 2 4 2-3 3
1 3-5 3
4-5 3
0-1 4
0-2 4
2-5 4

skupovi vrhova: {1, 2, 4, 3, 5, 0}

Strukture podataka i algoritmi 22


Kruskalov algoritam –
implementacija
def kruskal(a):
edges = []
for i in range(len(a)):
for j in range(i + 1, len(a)):
if a[i][j] < float('inf'):
edges.append((i, j, a[i][j]))
edges = sorted(edges, key=lambda t : t[2])
v = [i for i in range(len(a))]
result = []
i = 0
while len(result) < len(a)-1:
e = edges[i]
if v[e[0]] != v[e[1]):
v[e[1]] = v[e[0]]
result.append(e)
i += 1
return result

𝑂 𝐸 𝑙𝑜𝑔 𝐸
Strukture podataka i algoritmi 23
Problem najkraćih puteva

• usmjereni graf
• težina puta od čvora u do čvora v zbroju težina
bridova na putu od čvora u do čvora v
• najkraći put – put kod kojega je zbroj težina
bridova kroz koje prolazimo od čvora u do čvora
v najmanji

Strukture podataka i algoritmi 24


Dijkstrin algoritam

• najkraći put od jednog čvora do svih ostalih


čvorova
• skup obiđenih i skup neobiđenih čvorova
– u svakom koraku u skup obiđenih čvorova
dodajemo čvor u koji je najbliži početnom čvoru
– poboljšavamo (relaksiramo) sve puteve do još
neobiđenih čvorova koji idu preko čvora u

Strukture podataka i algoritmi 25


Dijkstrin algoritam
1 2 najkraći put
1
∞ ∞ čvor od početnog prethodnik
čvora

10 0 0 -1
0 1 ∞ -1
0 2 3
9 4 6
2 ∞ -1
3 ∞ -1
5 7
4 ∞ -1

3 4
2
∞ ∞

Strukture podataka i algoritmi 26


Dijkstrin algoritam
1 2 najkraći put
1
10 ∞ čvor od početnog prethodnik
čvora

10 0 0 -1
0 1 10 0
0 2 3
9 4 6
2 ∞ -1
3 5 0
5 7
4 ∞ -1

3 4
2
5 ∞

Strukture podataka i algoritmi 27


Dijkstrin algoritam
1 2 najkraći put
1
8 14 čvor od početnog prethodnik
čvora

10 0 0 -1
0 1 8 3
0 2 3
9 4 6
2 14 3
3 5 0
5 7
4 7 3

3 4
2
5 7

Strukture podataka i algoritmi 28


Dijkstrin algoritam
1 2 najkraći put
1
8 13 čvor od početnog prethodnik
čvora

10 0 0 -1
0 1 8 3
0 2 3
9 4 6
2 13 4
3 5 0
5 7
4 7 3

3 4
2
5 7

Strukture podataka i algoritmi 29


Dijkstrin algoritam
1 2 najkraći put
1
8 9 čvor od početnog prethodnik
čvora

10 0 0 -1
0 1 8 5
0 2 3
9 4 6
2 9 1
3 5 0
5 7
4 7 5

3 4
2
5 7

Strukture podataka i algoritmi 30


Dijkstrin algoritam
1 2 najkraći put
1
8 9 čvor od početnog prethodnik
čvora

10 0 0 -1
0 1 8 5
0 2 3
9 4 6
2 9 1
3 5 0
5 7
4 7 5

3 4
2
5 7

Strukture podataka i algoritmi 31


Dijkstrin algoritam - opis

1. postavi udaljenost do početnog vrha na 0


(trajno), a do svih ostalih na ∞
2. postavi početni vrh kao aktivan (u)
3. odredimo udaljenosti do svih čvorova (v) do
kojih možemo doći iz čvora u te relaksiramo
udaljenosti
4. odaberemo sljedeći neobrađeni čvor koji je
najbliži početnom čvoru
5. ponavljajmo korake od 3 – 5 sve dok nisu
obiđeni svi čvorovi

𝑂 𝐸 𝑙𝑜𝑔 𝑉
Strukture podataka i algoritmi 32
Dijkstrin algoritam – implementacija
def dijkstra(a, v):
distance = [float('inf')] * len(a)
distance[v] = 0
parent = [-1] * len(a)
done = []
while len(done) < len(a):
mini = 0
minv = float('inf')
for i in range(len(a)):
if not i in done and distance[i] < minv:
minv = distance[i]
mini = i
done.append(mini)
for i in range(len(a)):
if a[mini][i] + distance[mini] < distance[i]:
distance[i] = a[mini][i] + distance[mini]
return distance

Strukture podataka i algoritmi 33


Kraj 10. predavanja

Hvala na pozornosti!

Strukture podataka i algoritmi 34

You might also like