1 Graf Usmjereni Graf

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 15

Graf

Graf

Trgovački putnik mora obići n gradova (na slici n=5). Poznate su međusobne
udaljenosti svih tih gradova.
Trgovački putnik može krenuti iz bilo kojeg grada, mora obići sve gradove i vratiti se
natrag u početni grad i to tako da posjeti svaki grad samo jednom.
Postavlja se pitanje iz kojeg grada treba krenuti i kojim redom posjećivati pojedine
gradove tako da put koji će napraviti bude najkraći.

Zadatak riješite za domaću zadaću


Graf
Zadana je baza mjesta u Krapinsko-zagorskoj županiji i udaljenost između
mjesta koja su međusobno povezana. Za zadana dva mjesta odredi put koji
je najkraći između ta dva mjesta.
Google maps, navigacija …
Mjesta su čvorovi u grafu, a put između dva mjesta prikazujemo lukom
kojem dodjeljujemo oznaku (težinu)
Usmjereni graf

Za neki grad dana je baza trgova/raskršća i ulice koje ih povezuju te


udaljenost između pojedinih trgova/raskršća.
Za zadane dvije adrese odredi put između njih koji je najkraći.
Napomena ulice mogu biti jednosmjerne i dvosmjerne
Google maps, navigacija …
Graf i Usmjereni graf
• Uređena trojka (G,X,Y)
• X konačan skup podataka istog tipa koje zovemo čvorovi (vrhovi, vertex)
• Y konačan skup podataka istog tipa koje zovemo lukovi (grane, edge)
g: Y->XxX // injekcija

Graf
g(y)=(x1,x2) x1, x2 čvorovi

Usmjereni graf
g(y)=(x1,x2) x1 – početni čvor, x2 – završni čvor
ATP DiGraph
node - bilo koji tip podataka predstavlja čvor
arc - bilo koji tip podataka predstavlja luk
nlabeltype - bilo koji tip podataka predstavlja oznaku čvora
alabeltype - bilo koji tip podataka predstavlja oznaku luka
DiGraph - usmjereni graph pri čemu su čvorovi tipa node lukovi tipa arc
i pripadajućim oznakama
Make_null(G) - kreira prazni graph

insert_node(nl,G) - funkcija koja ubacuje novi čvor dodjeljuje mu


oznaku nl i vraća ime čvora.

insert_arc(G,x1,x2,al)- funkcija koja ubacuje novi luk u graph G kojem


je početni čvor x1, a završni čvor x2 dodjeljuje mu oznaku al i vraća ime luka.
Delete_node(G,x) - briše čvor x u graphu G (nije definirana ako je x spojen
sa nekim lukom)

Delete_arc(G,y) - briše luk y u graphu G (samo se luk briše)


Implementacija grafa pomoću matrice susjedstva
Nacrtajte implementaciju grafa pomoću matrice susjedstva gdje su
čvorovi – indeksi matrice, a oznake lukova pripadni elementi matrice

0 1 2 3 4

0 0 100 40 130 160

1 100 0 60 110 200

2 40 60 0 90 150

3 130 110 90 0 120

4 160 200 150 120 0


from random import *
def __setitem__(self,kljuc,x):
class Matrica:
i,j=map(int,kljuc)
def __init__(self, r=0, s=0):
self.mat[i][j]=x
self.r = r
if s==0:
def __getitem__(self,kljuc):
self.s = r
i,j=map(int,kljuc)
else:
return self.mat[i][j]
self.s = s
self.mat=[[0 for i in range(self.s)]
for j in range(self.r)] def __repr__(self):

return mat=''
for red in self.mat:

def popuni(self): for broj in red:

for i in range(self.r): mat+='{:5d}'.format(broj)

for j in range(self.s): mat+='\n'

self.mat[i][j]=randint(-3,5) return mat.strip('\n')

return self
Klasa usmjereni graf

Matrica susjedstva
0 1 2 3 4
0 0 1 1 0 0
1 1 0 1 1 0
2 0 1 0 0 1
3 0 0 1 0 1
4 0 1 0 0 0
Klasa usmjereni graf 0
0
0
1
1
2
1
3
0
4
0
1 1 0 1 1 0
Ne težinski graf – grane nemaju težinu 2 0 1 0 0 1
3 1 0 1 0 1
4 0 1 0 0 0

Matrica susjedstva
• Čvorove imenujemo brojevima 0, 1, …, n-1
• Grane prikazujemo listom parova (početni_čvor, završni_čvor)
• Ako u usmjerenom grafu postoji grana (i,j) 
čvor i je neposredni prethodnik čvora j, čvor j je neposredni sljedbenik čvora i

graf_c = UsmjereniGraf(n, grane_c, ime_grafa_c)


n – broj čvorova
grane_c = [(0,1),(0,2),(1,0),(1,2),(1,3),(2,1),(2,4),(3,0),(3,2),(3,4),(4,1)]  prvi element početni čvor, a drugi završni čvor
ime_grafa_c – string – ime grafa
def nep_pret(self):
from matrica import *
n_p = []

class UsmjereniGraf: for j in range(self.n):

def __init__(self, n, grane, ime_grafa = ''): p_j = []

self.n = n for i in range(self.n):

self.ime_grafa = ime_grafa if self.mat[i, j] == 1:


self.grane = grane p_j.append(i)
self.mat = Matrica(self.n) n_p.append(p_j)
for i in grane: return n_p
self.mat[i] = 1 def nep_sljed(self):
n_s = []
return
for i in range(self.n):
p_i = []
def mat_susjedstva(self):
for j in range(self.n):
return self.mat if self.mat[i, j] == 1:
p_i.append(j)
n_s.append(p_i)
return n_s
def nep_pret(self):
n_p = [] 0 1 2 3 4
for j in range(self.n): 0 0 1 1 0 0
p_j = []
1 1 0 1 1 0
2 0 1 0 0 1
for i in range(self.n):
3 1 0 1 0 1
if self.mat[i, j] == 1:
4 0 1 0 0 0
p_j.append(i)
n_p.append(p_j)
return n_p
def nep_sljed(self): • Metoda nep_pret() vraća listu neposrednih
n_s = [] prethodnika svakog čvora
for i in range(self.n): Lista prethodnika
p_i = [] [[1,3], [0, 2, 4], [0, 1, 3], [1], [2, 3]]
for j in range(self.n):
if self.mat[i, j] == 1: • Metoda nep_sljed() vraća listu neposrednih
p_i.append(j) prethodnika svakog čvora
n_s.append(p_i) Lista sljedbenika
return n_s [[1, 2], [0, 2, 3], [1, 4], [0, 2, 4], [1]]
Implementacija grafa pomoću 2 dvodimenzionalna polja
nodes arcs
nlabeltype first_arc alabeltype head
class Nodecell: 0 Zabok 0 0 16 1
nlabeltype = ‘’ 1 Tuhelj 4 1 7 2
2 Oroslavje 6 2 16 4
first_arc = ‘-’ 3 Bedekovčina 7 3 10 3
4 Krapina 9 4 16 0
5     5 23 4
6 10 3
class Arccell: 7 10 2
8 20 4
alabeltype = ‘’ 9 16 0
10 20 3
head = ‘-’

class Digraph:
nodes = [ Nodecell() for i in range(MAX)]
arccell = [ Arccell() for i in range(MAX)]
lastnode = 0
lastarc = 0
Zadatak

Usmjereni graf implementiran je matricom susjedstva (u stupcu su počeci, a u redu


krajevi lukova !!)

Nacrtaj zadani usmjereni graf

Prikaži graf pomoću implementacije pomoću dva dvodimenzionalna polja.

  1 2 3 4
1 A 1 - -  8 6
2 B 2 1 - - 12
3 C 3 - 18  - - 
4 D 4 15 - 16 -

You might also like