Académique Documents
Professionnel Documents
Culture Documents
Prirodno-matematički fakultet
Departman za matematiku i informatiku
Dragan Mašulović
Diskretne strukture 2
Deo 4: Teorija grafova
Grafovi
1
2 GLAVA 1. GRAFOVI
s t viseći čvor
izolovani
čvor ovo nije čvor
u
w
y grana
x
v
z
N(v)
čvor s t u v w x y z
δ 0 1 3 5 2 4 4 3
pa je δ (G) = 0 i ∆(G) = 5. Takode, N(v) = {u, w, x, y, z}.
Teorema 1.2 (Prva teorema teorije grafova) Ako je G = (V, E) graf sa m grana,
onda je ∑ δ (v) = 2m.
v∈V
Dokaz. Kako je svaka grana incidentna sa dva čvora, svaka grana je prebrojana dva
puta u sumi na levoj strani jednakosti.
odnosno, 7 · 77 = 2m, što je nemoguće jer je broj na levoj strani neparan, dok je
broj na desnoj strani paran.
K7 C9 P6
Slika 1.2: K7 , C9 i P6
Dokaz. Neka je x1 . . . xk−1 xk najduži put u G. Pošto je δ (xk ) > δ (G) > 2, čvor
xk ima suseda v koji nije xk−1 . Ako v ∈ / {x1 , . . . , xk−2 } onda je x1 . . . xk−1 xk v
put koji je duži od najdužeg puta u G, što je nemoguće. Dakle, v = x j za neko
j ∈ {1, . . . , k − 2}, pa su x j . . . xk čvorovi konture u G.
4 GLAVA 1. GRAFOVI
Često ćemo imati potrebu da prodemo kroz skup svih suseda nekog čvora u
grafu. Da bismo olakšali i automatizovali taj posao, uvešćemo klasu SkupSuseda
koja predstavlja (veoma primitivan) iterator po skupu suseda čvora u grafu. Metod
1.2. REPREZENTACIJA GRAFA 5
Primer 1.6 Evo primera programa koji učitava graf G i potom za svaki čvor tog
grafa štampa njegov stepen i spisak svih njegovih suseda.
Svaka instanca klase Graf ima četiri polja: N – broj čvorova grafa, M – broj
grana grafa, D – niz stepena čvorova grafa, i A – matrica susedstva grafa.
public class Graf {
public final static int NoVertex = −1;
private int N; // broj cvorova grafa
private int M; // broj grana grafa
private int [] D; // stepen cvora
private int [][] A; // matrica susedstva
7
8 GLAVA 1. GRAFOVI
}
D[i ] = s; sum += s;
}
M = sum / 2;
} catch (FileNotFoundException fn) {
System.out.println ( ” File not found: ” + fn );
} catch (Exception ex) {
System.out.println (ex);
}
SimpleIO.closeInput();
}
public Graf(int n) {
N = n; M = 0; D = new int[N]; A = new int[N][N];
for( int i = 0; i < N; i++){
for( int j = 0; j < N; j++) A[i ][ j ] = 0;
D[i ] = 0;
}
}
Primer 1.7 Primer grafa i njegove reprezentacije preko listi suseda dati su na
Sl. 1.4. Sa idx [0] = 0 smo označili da spisak suseda čvora broj 0 počinje od in-
deksa 0 niza list ; sa idx [1] = 2 smo označili da spisak suseda čvora broj 1 počinje
od indeksa 2 u nizu list ; i tako dalje. Zato što graf ima šest čvorova, popunjeno
je i polje idx [6] , a vrednost tog polja je 12 zato što 12 predstavlja indeks prvog
slobodnog polja u nizu list .
Sada ćemo grafove predstavljati kao slogove koji imaju četiri polja: N – broj
čvorova grafa, M – broj grana grafa, idx – niz indeksa, i list – liste suseda.
10 GLAVA 1. GRAFOVI
0 1 2
3 4 5
0 1 2 3 4 5 6
idx 0 2 5 6 8 11 12
list 1 3 0 3 4 4 0 1 1 2 5 4
// itd
izomorfni zato što graf G2 ima konturu C4 kao indukovani podgraf, što nije slučaj
sa grafom G3 .
3 3
q
b p 4
d
1 2 1 2
c
5 6 4 5 6
G1 G2 G3
Zadaci za vežbu
1.1. Dokazati da graf sa n čvorova može imati najviše 12 n · (n − 1) grana.
1.2. Neka je G graf sa n čvorova i n−1 grana. Dokazati da u G postoji izolovani
ili viseći čvor.
2m
1.3. Neka je G graf sa n čvorova i m grana. Dokazati da je ∆(G) > .
n
1.4. Koji od sledećih nizova mogu da se pojave kao nizovi stepena čvorova
nekog grafa?
(a) (1, 2, 2, 4, 5, 6, 7);
(b) (1, 1, 2, 2, 2, 3, 3);
(c) (1, 1, 3, 3, 3, 3, 5, 6, 8, 9).
1.5. Ako je n(G) > 2, onda postoje čvorovi v, w ∈ V (G) takvi da je v 6= w i
δ (v) = δ (w). Dokazati.
1.6. Za svako n > 2 postoji graf sa n čvorova u kome tačno jedan par čvorova
ima isti stepen. Dokazati.
ZADACI ZA VEŽBU 13
1.7. Neka je G graf u kome ne postoje dva čvora istog stepena koji imaju za-
jedničkog suseda. Dokazati da G ima viseći čvor.
†1.8. Neka je V = {1, 2, . . . , n}. Dokazati da ima
n
2
(a) 2 različitih grafova sa skupom čvorova V ;
n−1
2
(b) 2 različitih grafova sa skupom čvorova V čiji svi čvorovi su parni.
1.9. Neka je G graf sa osobinom δ (G) > 2. Dokazati da G sadrži put dužine
> δ (G) i konturu dužine > δ (G) + 1.
1.10. Za svaki graf G postoji regularan graf H takav da je G indukovani podgraf
grafa H i ∆(G) = ∆(H). Dokazati.
1.11. Klasi Graf dodati metode public int minDeg() koji odreduje minimalni
stepen grafa, i public int maxDeg() koja odreduje maksimalni stepen grafa.
1.12. Napisati Java program koji učitava graf i potom za svaki čvor u grafu
odreduje sumu stepena svih njegovih suseda, kao i srednju vrednost te
sume.
1.13. Implementirati preostale procedure u reprezentaciji grafova preko lista su-
seda.
14 GLAVA 1. GRAFOVI
Glava 2
Povezanost i rastojanje
Za graf kažemo da je povezan ako se od svakog čvora tog grafa može stići do
svakog drugog čvora grafa krećući se pri tome samo po granama grafa. Povezanost
je veoma važno svojstvo grafa i zato je važno imati efikasan algoritam koji se ono
proverava. Takav algoritam postoji, krajnje je jednostavan i svodi se na to da na
neki sistematski način obidemo svaki čvor grafa. Postoje dva standardna načina
obilaska čvorova grafa:
U prvom odeljku ove glave uvešćemo pojam povezanosti grafa, DFS algori-
tam, i pokazati kako se povezanost može lako utvrditi upotrebom DFS algoritma.
U drugom odeljku ćemo uvesti pojam rastojanja na povezanim grafovima, BFS
algoritam, i videti da se rastojanje dva čvora u grafu može lako dobiti upotrebom
BFS algoritma.
15
16 GLAVA 2. POVEZANOST I RASTOJANJE
Lema 2.1 Ako postoji šetnja u G koja povezuje dva čvora, onda postoji i put koji
ih povezuje.
Dokaz. Neka su u i w različiti čvorovi grafa G takvi da postoji šetnja koja ih
povezuje. Dokažimo da onda postoji i put koji ih povezuje. Od svih šetnji koje
povezuju u i w uočimo najkraću, i neka je to šetnja
u = v0 e1 v1 e2 v2 . . . vk−1 ek vk = w.
v j−1 vi+1
Teorema 2.2 Neka je G graf. Na skupu V (G) definišemo binarnu relaciju θ ovako:
xθ y ako x = y ili postoji šetnja koja spaja x sa y. Tada je θ relacija ekvivalencije na
V (G).
Kao i svaka druga relacija ekvivalencije, relacija θ razbija skup V (G) na blo-
kove S1 , . . . , St . Ove blokove, ili odgovarajuće indukovane podgrafove (kako nam
kad više odgovara) zovemo komponente povezanosti grafa G. Broj komponenti
povezanosti grafa G označavamo sa cc(G). Graf G je povezan ako je cc(G) = 1.
Primer povezanog grafa i primer grafa sa četiri komponente povezanosti dati su na
Sl. 2.1.
Da bismo mogli algoritamski da identifikujemo komponente nekog grafa, po-
trebno je da imamo sistematski način obilaženja čvorova tog grafa. Pretraživanje u
dubinu (depth-first search) je jedan veoma elegantan način da se to uradi: krenuvši
od nekog čvora u grafu, za svakog suseda tog čvora koga do sada nismo posetili
rekurzivno pozovemo algoritam. Dakle, posetimo polazni čvor, potom posetimo
njegovog prvog suseda, pa prvog suseda prvog suseda, i tako u dubinu dokle god
2.1. POVEZANOST I DFS 17
(a) (b)
Slika 2.1: (a) Povezan graf; (b) Graf G kod koga je cc(G) = 4
Metod DFS klase Graf koji obilazi čvorove grafa G počev od čvora v izgleda
ovako:
18 GLAVA 2. POVEZANOST I RASTOJANJE
Sada ćemo dokazati ovu važnu osobinu algoritma DFS. Krenimo sa jednim
pomoćnim tvrdenjem.
Lema 2.5 Neka je G graf nad kojim je izvršenja procedura DFS i neka je na taj
način dobijen niz stamp. Ako je dft .stamp[v] != 0 za neko v ∈ V (G), onda je
dft .stamp[w] != 0 za svakog suseda w čvora v.
Teorema 2.6 Neka je G graf, neka je v ∈ V (G) proizvoljno i neka je nad G izvršena
procedura DFS(v, dft) . Tada za svaki x ∈ V (G) važi sledeće: dft .stamp[x] != 0 ako
i samo ako x pripada komponenti povezanosti čvora v. Drugim rečima, DFS(v, dft)
može da dosegne samo one čvorove koji pripadaju komponenti povezanosti čvora v.
Dokaz. (⇒) Ako je dft .stamp[x] != 0 to znači da je algoritam u nizu rekurzivnih
poziva stigao od čvora v do čvora x. Obzirom da algoritam u svakom koraku prelazi
sa čvora na njemu susedni čvor koga do tada nije posetio, dobijamo da postoji put
od v do x, što znači da x pripada komponenti povezanosti čvora v.
(⇐) Neka x pripada komponenti povezanosti čvora v. Tada postoji šetnja
v e1 v1 e2 v2 . . . ek−1 vk−1 ek x. Nad grafom G je izvršena procedura DFS(v, dft) ,
što znači da je dft .stamp[v ] == 1. Prema Lemi 2.5 je dft .stamp[v1 ] != 0 zato što
je v1 susedan sa v. Na isti način zaključujemo da je dft .stamp[v2 ] != 0 zato što je
v2 susedan sa v1 . I tako dalje. Na kraju dobijamo da je dft .stamp[x ] != 0 zato što
je x susedan sa vk−1 .
Šematski prikaz redosleda obilaska čvorova grafa na Sl. 2.2 (a) BFS algorit-
mom prikazn je na Sl. 2.2 (b).
Implementacija BFS algoritma se oslanja na standardnu strukturu podataka
koja se zove red za čekanje (engl. queue). Red za čekanje je linearna struktura
podataka kod koje nove elemente dodajemo na kraj reda, a postojeće elemente ski-
damo sa početka reda. Red za čekanje možemo da zamislimo kao jednu dugačku
i usku cev u koju ubacujemo elemente na jedan kraj, a vadimo ih sa drugog kraja.
Zato se red za čekanje često opisuje i kao FIFO struktura podataka (FIFO = First
In, First Out). Na Sl. 2.2 (c) je pokazano kako se red za čekanje koristi da se dobije
BFS-redosled obilaska čvorova grafa.
Za potrebe demonstracije BFS algoritma koristićemo standardnu Javinu klasu
Queue, kao i niz bft (= breadth-first time) u kome, slično DFS algoritmu, pam-
22 GLAVA 2. POVEZANOST I RASTOJANJE
2 3 4 5
6 7 8 9 10 11 12 13 14 15
(a)
2 3 4 5
6 7 8 9 10 11 12 13 14 15
(b)
Red za čekanje
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(c)
Slika 2.2: (a) Graf G; (b) Redosled obilaska čvorova grafa G BFS algoritmom;
(c) Redosled čvorova u redu za čekanje BFS algoritma
2.2. RASTOJANJE I BFS 23
timo kojim redom smo posetili koji čvor: bft .stamp[v] == k ako i samo ako smo u
trenutku T = k posetili čvor v.
Procedura BFS koja obilazi čvorove grafa G počev od čvora v izgleda ovako:
Iako na različite načine obilaze čvorove grafa, algoritme BFS i DFS ravno-
pravno možemo da koristimo da bismo utvrdili da li je graf povezan ili ne, kao i
da bismo utvrdili broj njegovih komponenti povezanosti. Analogno Posledici 2.7
imamo sledeće tvrdenje
Teorema 2.9 Neka je G graf, neka je v ∈ V (G) proizvoljno i neka je nad G izvršena
procedura BFS(v, bft) . Graf G je povezan ako i samo ako je bft .stamp[x] != 0 za
sve x ∈ V (G).
dG (x, x) = 0,
dG (x, y) = min{k : postoji put dužine k koji spaja x sa y}, za x 6= y.
Ako se graf G podrazumeva, umesto dG (x, y) pišemo samo d(x, y). Ovako defini-
sano rastojanje pokorava se zakonima koji odreduju da li neka funkcija zaslužuje
da se tako zove:
Teorema 2.10 Neka je G = (V, E) povezan graf. Tada je (V, dG ) metrički prostor.
Drugim rečima, za sve x, y, z ∈ V zadovoljeno je sledeće:
(D1) dG (x, y) > 0;
(D2) dG (x, y) = 0 ako i samo ako x = y;
(D3) dG (x, y) = dG (y, x); i
(D4) dG (x, z) 6 dG (x, y) + dG (y, z).
Primetimo da su čvorovi u i v susedni u povezanom grafu G ako i samo ako je
dG (u, v) = 1.
Kada primenimo BFS algoritam na povezani graf G počev od čvora v dobijamo
situaciju koja je ilustrovana na Sl. 2.3 (a). Vidimo da je skup čvorova grafa G
razbijen na slojeve L0 (v), L1 (v), L2 (v), . . . koje formalno možemo opisati ovako:
L0 (v) = {v}
Lk+1 (v) = {x ∈ V (G) : x ∈
/ L0 (v) ∪ L1 (v) ∪ . . . ∪ Lk (v) i
x je susedan sa nekim čvorom iz skupa Lk (v)}.
L0 (v) : 1
L1 (v) : 2 3 4 5
L2 (v) : 6 7 8 9 10 11 12 13 14 15
(a)
Red za čekanje
0 1 1 1 1 2 2 2 2 2 2 2 2 2 2
(b)
Slika 2.3: (a) Slojevi koji nastaju tokom rada BFS algoritma; (b) Formiranje vred-
nosti u nizu BFT
bft .stamp[v] = 0;
Q.add(v);
while(Q.peek() != null){
v = Q.remove();
SkupSuseda S = susedi(v);
while(imaJos(S)){
int w = sledeci(S);
if ( bft .stamp[w] == −1){
bft .stamp[w] = bft .stamp[v] + 1;
Q.add(w);
}
}
}
return bft .stamp;
}
Zadaci za vežbu
2.1. Dokazati da za svaki paran broj n > 6 postoji povezan regularan graf ste-
pena 3 sa n čvorova koji ne sadrži C3 kao podgraf.
1
2.2. Ako je δ (G) > n(G) onda je G povezan. Dokazati.
2
2.3. Neka je G = (V, E) povezan graf sa nčvorova
i neka je u proizvoljan čvor
n
grafa G. Dokazati da je ∑ d(u, x) 6 .
x∈V 2
2.4. Napisati program koji razvrstava čvorove grafa prema komponentama po-
vezanosti kojima pripadaju.
2.5. Napisati nerekurzivni metod DFS.
(Uputstvo: Slično kao BFS, samo što se umesto reda za čekanje koristi
stek. Stek (engl. stack) je način linearne organizacije podataka kod koga
elemente niza ne možemo da upisujemo gde želimo već možemo da ih
ZADACI ZA VEŽBU 27
Ako graf predstavlja neki sistem veza, onda je važno znati gde su slabe tačke
tog sistema da bi se u realnom životu mogle dodatno obezbediti. Ovde pod slabom
tačkom podrazumevamo čvor ili granu čijim udaljavanjem se graf raspada. Tako
dolazimo do pojma mosta i artikulacionog čvora, kojima se bavi prvi odeljak ove
glave.
Razmatranje ekstremnih konfiguracija u odnosu na datu osobinu često može da
pruži dodatni uvid o toj osobini. Ako fiksiramo skup čvorova, maksimalan pove-
zan graf sa datim skupom čvorova je kompletan graf, a ta klasa grafova nije previše
interesantna. Medutim, minimalni povezani grafovi sa datim skupom čvorova su
posebno interesantni. Takve grafove zovemo stabla (iako ćemo za zvaničnu defi-
niciju odabrati nešto drugačiji pristup) i njima se bavi drugi podeljak ove glave.
Potom uvodimo pojam stabla pretraživanja grafa i stabla pretraživanja DFS algo-
ritma. Klasifikacija grana grafa u odnosu na stablo pretraživanja DFS algoritma
nam daje nekoliko elegantnih algoritama, medu kojima izdvajamo algoritam koji
odreduje sve artikulacione čvorove grafa.
29
30 GLAVA 3. MOSTOVI, ARTIKULACIONI ČVOROVI I STABLA
Teorema 3.1 Neka je e grana grafa G. Tada, e je most grafa G ako i samo ako e
ne pripada nijednoj konturi grafa G.
Dokaz. Dokaz provodimo za povezane grafove. Ako G nije povezan, dovoljno je
ograničiti se na komponentu povezanosti koja sadrži e.
(⇒): Pretpostavimo da grana e pripada konturi C = v0 e v1 e2 v2 . . . vk−1 ek v0
↑
grafa G. Da bismo pokazali da je G − e povezan uzmimo proizvoljne čvorove
x 6= y. Zato što je G povezan, postoji put P koji spaja x sa y. Ako P ne sadrži
granu e, to je onda i put u G − e koji spaja x sa y. Ako, medutim, P sadrži granu e,
recimo P = x . . . v0 e v1 . . . y, tada možemo pojavljivanje grane e na putu P zameniti
sa C − e i tako dobiti šetnju W = x . . . v0 ek vk−1 . . . v2 e2 v1 . . . y, Sl. 3.1. Zato što
| {z }
C−e
se e pojavljuje samo jednom u P i samo jednom u C, sledi da se e ne pojavljuje u
šetnji W , tako da je W šetnja koja spaja x sa y u G − e.
x v0 e v1 y
P
ek e2
vk−1 C v2
(⇐) Pretpostavnimo, sada, da grana e nije most grafa G i neka je e = {x, y}.
Tada je graf G − e povezan, pa postoji put x e1 v1 e2 . . . vk−1 ek y koji u G − e
spaja x sa y. Zato što je ovo put u G − e, svi čvorovi x, v1 , . . . , vk−1 , y su različiti i
e∈/ {e1 , e2 , . . . , ek }. Dakle, x e1 v1 e2 . . . vk−1 ek y e x je kontura u G koja sadrži e.
Teorema 3.2 Čvor v je artikulacioni čvor grafa G ako i samo ako se čvorovi skupa
V (G) \ {v} mogu podeliti u dve neprazne grupe A i B tako da za svako a ∈ A i
svako b ∈ B, svaki put od a do b sadrži v.
Dokaz. Dokaz provodimo za povezane grafove. Ako G nije povezan, dovoljno je
ograničiti se na komponentu povezanosti koja sadrži v.
3.2. DETEKCIJA ARTIKULACIONIH ČVOROVA I MOSTOVA 31
(⇒) Neka je v artikulacioni čvor grafa G. Tada G − v nije povezan graf. Neka
su S1 , S2 , . . . , Sk komponente povezanosti grafa G − v i neka je A = S1 i B =
S2 ∪ . . . ∪ Sk . Neka su a ∈ A i b ∈ B proizvoljni. Neka je j > 2 takvo da je b ∈ S j .
Ako bi u grafu G postojao put od a do b koji ne sadrži v, to bi onda bio i put od a
do b u grafu G − v, pa bi sledilo da u grafu G − v postoji put od komponente S1 do
komponente S j . No, tada S1 i S j ne bi bile različite komponente povezanosti grafa
G − v, što je nemoguće. Dakle, svaki put od a do b u G sadrži v.
(⇐) Pretpostavimo da smo čvorove skupa V (G) \ {v} podelili u dve neprazne
grupe tako da za svako a ∈ A i svako b ∈ B, svaki put od a do b sadrži v. Odaberimo
proizvoljno a ∈ A i proizvoljno b ∈ B. Kako u grafu G svaki put od a do b sadrži
v, sledi da u grafu G − v ne postoji put od a do b. Dakle, graf G − v nije povezan i
zato je v artikulacioni čvor.
3.3 Stabla
Stablo je povezan graf koji ne sadrži konture. Prema Teoremi 3.1 svaka grana
stabla je most. Stablo je minimalan povezan graf sa datim skupom čvorova. Na-
redna teorema pokazuje da stabla na izvestan način opisuju esenciju pojma pove-
zanosti. Podsetimo se da je graf H = (W, E ′ ) pokrivajući podgraf grafa G = (V, E)
ako je W = V i E ′ ⊆ E. Ako je uz to H još i stablo, kažemo da je H pokrivajuće
stablo grafa G.
3.3. STABLA 33
• grane stabla,
• povratne grane, i
• poprečne grane.
Kada se stablo pretraživanja crta od gore ka dole povratne grane (engl. backed-
ges) vode “u natrag” i odatle ime. Naravno, ako je (T, v) proizvoljno stablo pre-
traživanja grafa, u tom grafu mogu da postoje sve tri vrste grana. Medutim, stablo
pretraživanja DFS algoritma je posebno:
Teorema 3.3 U stablu pretraživanja DFS algoritma nad povezanim grafom nema
poprečnih grana.
Teorema 3.4 Povezan graf je stablo ako i samo ako stablo pretraživanja DFS al-
goritma nad tim grafom nema povratnu granu.
Dokaz. Neka je (T, v) stablo pretraživanja DFS algoritma nad povezanim gra-
fom G.
(⇐) Ako stablo T ima povratnu granu e = {x, y}, grana e sa putem od x do y
kroz stablo T zatvara konturu, pa polazni graf nije stablo.
(⇒) Pretpostavimo sada da stablo T nema povratnih grana. Kako stablo pre-
traživanja DFS algoritma nema poprečnih grana (Teorema 3.3), sledi da je E(G) =
3.3. STABLA 35
Imaćemo situacije kada znamo da graf koga posmatramo nije povezan, ali nas
interesuje da li je komponenta povezanosti kojoj pripada dati čvor x stablo. U tom
slučaju dovoljno je pustiti DFS od čvora x i proveriti da li se pojavila povratna
grana. Proceduri DFS se ovaj put mora proslediti ne samo čvor od koga počinjemo
već i redni broj njegovog oca u stablu pretraživanja da bismo mogli da identifi-
kujemo povratne grane: grana je povratna ako ide od tekućeg čvora ka nekom
označenom čvoru koji nije otac tekućeg čvora.
private boolean imaPovratnuGr(int v, int otac, TimeStamps dft) {
boolean povratnaGr = false;
dft .stamp[v] = 1;
SkupSuseda S = susedi(v);
while(!povratnaGr && imaJos(S)){
int w = sledeci(S);
if ( dft .stamp[w] == 0){
povratnaGr = imaPovratnuGr(w, v, dft);
}
else if (w != otac) {
povratnaGr = true;
}
}
return povratnaGr;
}
Teorema 3.5 Graf je povezan ako i samo ako ima pokrivajuće stablo.
Dokaz. Ako graf ima pokrivajući podgraf koji je povezan, onda i polazni graf
mora biti povezan. Dakle, ako graf ima pokrivajuće stablo, on je povezan. Obr-
nuto, ako je graf povezan onda DFS algoritam poseti svaki čvor tog grafa. Stablo
pretraživanja DFS algoritma je pokrivajuće stablo grafa.
Lema 3.6 Stablo sa bar dva čvora ima bar dva viseća čvora.
Dokaz. Neka je G stablo sa n > 2 čvorova i neka je v1 v2 . . . vk najduži put u stablu.
Tada je k > 2 jer je G povezan graf sa bar dva čvora. Ako je δ (v1 ) > 1 onda v1
ima suseda x koji nije v2 . Ako bi x bio novi čvor, tj. x ∈ / {v3 , . . . , vk }, tada bi put
x v1 v2 . . . vk bio duži od najdužeg puta u G, što nije moguće. S druge strane, ako je
x ∈ {v3 , . . . , vk } onda G ima konturu, što je u suprotnosti sa pretpostavkom da je G
stablo. Dakle, v1 je viseći čvor. Na isti način pokazujemo da je i vk viseći čvor.
Dokaz. Drugi deo tvrdenja je direktna posledica Prve teoreme teorije grafova.
Dokažimo sada da je m = n − 1. Dokaz provodimo indukcijom po n. Slučajevi
n = 1 i n = 2 su trivijalni. Pretpostavimo da je tvrdenje tačno za sva stabla sa ma-
nje od n čvorova i posmatrajmo stablo G sa n čvorova. Prema Lemi 3.6 stablo G
ima viseći čvor x. Prema Teoremi 3.2 stepen artikulacionog čvora je najmanje 2.
Zato x nije artikulacioni čvor grafa G, pa je G − x povezan. Jasno je i to da G − x
nema konture (uklanjanje čvorova ne može da dovede do toga da se u grafu pojave
konture), odakle sledi da je G − x stablo sa manje od n čvorova. Prema induktivnoj
hipotezi, m′ = n′ − 1, gde je m′ = m(G − x) i n′ = n(G − x). Kako je m′ = m − 1 i
n′ = n − 1 (x je viseći čvor), zaključujemo da je m = n − 1.
k
i n = ∑ ni ). Iz pretpostavke m = n − 1 sada lako zaključujemo da je k = 1, tj. G je
i=1
povezan graf.
Posledica 3.10 Svake dve od naredne tri osobine impliciraju onu treću:
• graf je povezan,
• graf nema konture,
• m = n − 1.
1 H.Prüfer, Neuer Beweis eines Satzes über Permutationen, Archiv der Math. und Phys. (3)
27(1918), 142–144.
38 GLAVA 3. MOSTOVI, ARTIKULACIONI ČVOROVI I STABLA
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
1 2 1 2 1 2 1 2
3 4 3 4 3 4 3 4
Slika 3.2: Šesnaest različitih i samo dva neizomorfna stabla na skupu od četiri
čvora
b1 = mix{4, 7, 3, 4, 1, 4, 4, 9} = 2
b2 = mix{ 7, 3, 4, 1, 4, 4, 9, 2} = 5
b3 = mix{ 3, 4, 1, 4, 4, 9, 2, 5} = 6
b4 = mix{ 4, 1, 4, 4, 9, 2, 5, 6} = 3
b5 = mix{ 1, 4, 4, 9, 2, 5, 6, 3} = 7
b6 = mix{ 4, 4, 9, 2, 5, 6, 3, 7} = 1
b7 = mix{ 4, 9, 2, 5, 6, 3, 7, 1} = 8
b8 = mix{ 9, 2, 5, 6, 3, 7, 1, 8} = 4
5 7 1 4 9 7 1 4 9 4 9
2
6 3 8 3 8 8
bi : 2 bi : 2 5 6 3 bi : 2 5 6 3 7 1 8
ai : 4 ai : 4 7 3 7 ai : 4 7 3 7 1 4 4
5 7 1 4 9 7 1 4 9 4 9
STOP
6 3 8 8
bi : 2 5 bi : 2 5 6 3 7
ai : 4 7 ai : 4 7 3 7 1
7 1 4 9 1 4 9
5 7 1 4 9
6 3 8 8
2
6 3 8
bi : 2 5 6 bi : 2 5 6 3 7 1
ai : 4 7 3 ai : 4 7 3 7 1 4 4 7 3 7 1 4 4
Y
K3,4 S10
Lema 3.12 Svaka zatvorena šetnja neparne dužine sadrži neparnu konturu.
v0 e1 v1 e2 v2 . . . vk−1 ek vk = v0 .
Ako su svi čvorovi iz skupa {v0 , v1 , . . . , vk−1 } različiti, ova zatvorena šetnja je ne-
parna kontura i tvrdenje je pokazano. Pretpostavimo, zato, da je vi = v j za neke
i, j ∈ {0, 1, . . . , k − 1}, i < j:
3.5. BIPARTITNI GRAFOVI 41
v1
vi−1 vi+1
v0 vi
vk W1 vj W2
v j+1
vk−1 v j−1
Jedna od njih, recimo W1 , je neparne dužine (jer ako su obe parne ili obe neparne,
polazna šetnja bi bila parne dužine), pa prema induktivnoj hipotezi, ona sadrži
neparnu konturu. Time je pokazano da i polazna zatvorena šetnja sadrži neparnu
konturu.
Teorema 3.13 Graf sa bar dva čvora je bipartitan ako i samo ako ne sadrži neparnu
konturu.
Dokaz. Lako se vidi da je graf sa bar dva čvora bipartitan ako i samo ako je svaka
njegova komponenta povezanosti ili izolovani čvor ili bipartitan graf. Zato je do-
voljno dokazati teoremu za povezane grafove, pa pretpostavimo da je G povezan
graf i n(G) > 2.
(⇒) Neka je G bipartitan graf i pretpostavimo da G sadrži neparnu konturu čiji
čvorovi su v1 , v2 , . . . , v2k+1 . Neka su oznake uvedene tako da je vi susedan sa vi+1
za i ∈ {1, . . . , 2k}, i v2k+1 je susedan sa v1 . Neka je {X ,Y } particija skupa V (G)
koja pokazuje da je G bipartitan graf, tj. koja ima osobinu E(G[X ]) = E(G[Y ]) = ∅.
Čvor v1 pripada jednom od dva bloka particije, pa bez umanjenja opštosti možemo
pretpostaviti da je v1 ∈ X . Tada je v2 ∈ Y zato što je v2 susedan sa v1 , a G je biparti-
tan. Na isti način zaključujemo da je v3 ∈ X , v4 ∈ Y i tako dalje. Vidimo da čvorovi
sa neparnim indeksom pripadaju skupu X , odakle sledi v2k+1 ∈ X . Medutim, i
x1 ∈ X , pa E(G[X ]) sadrži granu {x1 , x2k+1 } što je u suprotnosti sa pretpostav-
kom E(G[X ]) = ∅.
(⇐) Pretpostavimo da G ne sadrži neparnu konturu i pokažimo da je to bipar-
titan graf. Uzmimo proizvoljan čvor v ∈ V (G) i definišimo A0 , A1 , . . . ⊆ V (G) na
sledeći način:
An = {x ∈ V (G) : d(v, x) = n},
za n > 0. Zato što je G povezan, postoji put koji spaja v sa svakim drugim čvorom
grafa, pa zaključujemo da se svaki čvor grafa G javlja u bar jednom od skupova Ai .
42 GLAVA 3. MOSTOVI, ARTIKULACIONI ČVOROVI I STABLA
Posledica 3.14 Povezan graf ima neparnu konturu ako i samo ako postoji povratna
grana u stablu pretraživanja DFS algoritma koja zatvara neparnu konturu.
Zato je ideja algoritma koji proverava da li je komponenta čvora v bipartitan
graf slična ideji koju smo koristili da proverimo da li je komponenta stablo. Tamo
je bilo bitno da ne postoje povratne grane, a ovde je bitmo da povratne grane,
ukoliko postoje, ne zatvore neparnu konturu. Da bismo proverili da li je kontura
parna koristićemo veoma jednostavno označavanje. Čvorove ćemo u nizu dft .stap
naizmenično označavati sa 1 ili 2 i to tako da ako je otac u stablu pretraživanja
označen sa s, onda su svi njegovi sinovi označeni sa 3 − s, s ∈ {1, 2}. Tada graf
ima neparnu konturu ako i samo ako postoji povratna grana čiji čvorovi su označeni
na isti način. Obzirom da oznake idu naizmenično 1 − 2 − 1 − 2 − . . . , kod neparne
konture se moraju pojaviti dva susedna čvora koji su označeni na isti način.
ZADACI ZA VEŽBU 43
Zadaci za vežbu
3.1. (a) Dati primer grafa koji nema ni artikulacioni čvor ni most.
(b) Dati primer grafa koji ima artikulacioni čvor, ali nema most.
(c) Dati primer grafa koji nema artikulacioni čvor, ali ima most.
(d) Dati primer grafa koji ima i artikulacioni čvor i most.
3.2. Neka je G povezan graf sa bar dva čvora. Dokazati da G ima bar dva čvora
koji nisu artikulacioni čvorovi.
3.3. Neka je stepen svakog čvora u povezanom grafu G paran. Dokazati da je
44 GLAVA 3. MOSTOVI, ARTIKULACIONI ČVOROVI I STABLA
1
cc(G − v) 6 δ (v) za sve v ∈ V (G).
2
3.4. Graf je stablo ako i samo ako za svaki par različitih čvorova postoji tačno
jedan put koji ih spaja. Dokazati.
3.5. Graf je stablo ako i samo ako ima jedinstveno pokrivajuće stablo. Doka-
zati.
3.6. Dokazati da stablo G ima bar ∆(G) visećih čvorova.
3.7. Neka je T stablo, ∆ = ∆(T ) i fk broj čvorova u T čiji stepen je k. Dokazati
∆
da je f1 = 2 + ∑ (k − 2) fk .
k=3
(a) Dokazati da dva bloka u grafu mogu imati najviše jedan zajednički
čvor.
Težinski grafovi
4.1 Uvod
Težinski graf je uredeni par (G, w) gde je 2
G graf, a w : E(G) → N funkcija koja svakoj 1 3
grani e grafa G dodeljuje pozitivan ceo broj 8
w(e) koji se zove težina grane. Funkciju w 3 6
21 9
zovemo težinska funkcija. Primer jednog te-
žinskog grafa dat je na slici pored. U tom 1
primeru težina grane {1, 3} je 21. 4 17 6 7
Stepen čvora u težinskom grafu (G, w),
povezanost težinskog grafa, podgraf težin-
skog grafa, kao i mnogi drugi pojmovi, pre- 4 12
5
nose se direktno sa grafa G.
Medutim, rastojanje u težinskom grafu ćemo definisati drugačije, na način koji
uzima u obzir težine grana. Težina podgrafa H težinskog grafa (G, w) se uvodi
prirodno:
w(H) = ∑ w(e).
e∈E(H)
47
48 GLAVA 4. TEŽINSKI GRAFOVI
Ukoliko je iz konteksta jasno o kom težinskom grafu se govori, umesto d(G,w) (x, y)
pisaćemo kratko d(x, y).
Teorema 4.2 Neka je (G, w) težinski graf. Tada je (V (G), d(G,w) ) metrički prostor.
1
1 3
8 W (G) 0 1 2 3 4 5
2 21 9 5 0 0 8 21 17 6 9
G= 0 1 8 0 1 0 0 3
2 21 1 0 4 0 0
4 17 6 7
3 17 0 4 0 12 0
4 6 0 0 12 0 7
3 12
4 5 9 3 0 0 7 0
4.3. RASTOJANJA U GRAFU 49
Težinske grafove predstavljamo kao “obične grafove”, s tim što sada matrica
susedstva umesto brojeva 0 (nisu susedni) i 1 (jesu susedni) sadrži 0 kada čvorovi
nisu susedni i strogo pozitivni vrednost kada su čvorovi susedni. Ova pozitivna
vrednost predstavlja težinu grane. Implementacija klase Graf koju smo do sada
koristi ispunjava sve ove zahteve. Potrebno joj je dodati samo još nekoliko metoda
koji su specifični za rad sa težinskim grafovima.
// vraca tezinu grane uv
public int tezina( int u, int v) { return A[u][v ]; }
• Floydov algoritam koji nalazi rastojanje svaka dva čvora u grafu (all-pairs
shortest path problem); i
(k−1)
k (k−1)
dik dk j
(k−1)
di j
(k)
di j = min i j
d (k−1) + d (k−1) (k−1)
ik kj di j
(k)
Ako su sva tri puta na slici postoje u (k − 1)-om koraku, onda se vrednost di j
računa kako je navedeno. Na Sl. 4.1 pokazano je kako se ponašamo kada neki od
ovih puteva ne postoji u k-tom koraku. (Da se podsetimo, u (k − 1)-om koraku
računamo dužinu najkraćeg puta koji spaja čvorove i i j, a koji prolazi samo kroz
čvorove 1, . . . , k − 1; prema tome, može se desiti da za neki par čvorova i i j ne
postoji put koji ih spaja, a prolazi samo kroz čvorove 1, . . . , k − 1).
Pošto obračun vršimo samo za slučaj i 6= j 6= k 6= i, lako se vidi da se tokom k-
tog koraka ne menja nijedno polje matrice D oblika dik ili dk j . Zato se ceo postupak
može izvršiti u jednoj matrici i procedura koja to radi je veoma jednostavna.
public int [][] Floyd() {
int [][] D = new int[N][N];
int i , j , k;
for( i = 0; i < N; i++)
for( j = 0; j < N; j++)
D[i ][ j ] = tezina( i , j );
i j i j i j
(k−1) (k−1) (k−1)
di j di j di j
(k) (k−1)
di j = di j , odnosno, ne treba menjati di j
(k−1) k (k−1)
dk j
dik
i j
(k−1) k k (k−1)
dk j k
dik
i j i j i j
(k)
di j = 0, odnosno, ne treba menjati di j
51
Slika 4.1: Obračun najkraćeg puta u Floydovom algoritmu u slučajevima kada neke od dužina još nisu izračunate
52 GLAVA 4. TEŽINSKI GRAFOVI
1, . . . , k − 1 postoje, tj. ukoliko je svaki od navedena tri broja strogo pozitivan. Ako
bar jedan od najkraćih puteva ne postoji, nastao je neki od patoloških slučajeva sa
Sl. 4.1 i vrednost di j treba ažurirati samo u jednom slučaju.
od svih grana koje imaju jedan čvor u skupu do sada odabranih čvorova,
a drugi izvan, nademo onu koja ima najmanju težinu i dodamo tu granu
stablu.
Dokaz. U svakom koraku algoritma podgrafu T (koji polako raste) dodajemo jedan
novi čvor v i jednu novu granu koja v spaja sa čvorom u koji je već u podgrafu.
Time je obezbedeno da nijedna nova grana ne zatvori konturu u podgrafu T . Dakle,
na kraju rada algoritma dobijamo podgraf T grafa G koji nema konture, ima n
čvorova i n − 1 granu. Prema Teoremi 3.8 podgraf T je stablo. Kako T i G imaju
isti broj čvorova, T je pokrivajuće stablo grafa G.
Dokaz. Neka je (G, w) povezan težinski graf. Neka je e1 , e2 , . . . , en−1 niz grana, a
T0 , T1 , . . . , Tn−1 niz stabala koji se dobijaju u Primovom algoritmu. Jasno je da se
T0 sastoji samo od jednog čvora i da je E(Tk ) = {e1 , . . . , ek } za k = 1, 2, . . . , n − 1.
Pokažimo da za svako k = 0, 1, . . . , n−1 postoji minimalno pokrivajuće stablo grafa
G koje kao svoj podgraf sadrži stablo Tk . Dokaz provodimo indukcijom po k.
Neka je M proizvoljno minimalno pokrivajuće stablo grafa G. Ono sadrži sve
čvorove grafa, pa i čvor od koga se sastoji graf T0 . Ovim je tvrdenje pokazano za
k = 0.
Pretpostavimo da je tvrdenje tačno za k i neka je M minimalno pokrivajuće
stablo koje kao svoj podgraf sadrži Tk . Uočimo da stablo Tk+1 ima samo jednu
granu više od stabla Tk . To je grana ek+1 . Ako stablo M sadrži i granu ek+1 , dokaz
je završen: M je minimalno pokrivajuće stablo grafa koje sadrži Tk+1 kao svoj
podgraf. Ako stablo M ne sadrži granu ek+1 , situacija se malo komplikuje.
Neka je ek+1 = {u, v} pri čemu se čvor u nalazi
u V (Tk ), a čvor v u V (G) \V (Tk ). Kako je M pokri- M
Tk
vajuće stablo grafa G, ono sadrži sve čvorove grafa
G, pa i čvorove u i v. Zbog povezanosti grafa M u′ v′
postoji put u M koji počinje u čvoru u, a završava
se u čvoru v. Kako se čvor u nalazi u V (Tk ), a čvor
v u V (G) \V (Tk ), to put u M koji spaja u i v mora
sadržati granu koja takode ima jedan čvor u V (Tk )
u v
a drugi izvan. Neka je to grana e′ = {u′ , v′ } i neka
je u′ ∈ V (Tk ), a v′ izvan. Prema tome, kako je grana
ek+1 birana dobijamo da je w(ek+1 ) 6 w(e′ ).
Posmatrajmo graf M ′ koji se dobija tako što se iz grafa M izbaci grana e′ i ubaci
grana ek+1 . Graf M ′ nema kontura, ima n čvorova i n − 1 granu pa je to stablo.
Kako i M ′ pokriva sve čvorove grafa G zaključujemo da je M ′ pokrivajuće stablo.
Pokažimo da je M ′ minimalno pokrivajuće stablo grafa G. Zbog w(ek+1 ) 6 w(e′ )
i činjenice da se M i M ′ razlikuju samo po tome što je iz M izbačena grana e′ i
ubačena grana ek+1 odmah se vidi da je w(M ′ ) 6 w(M). No, kako je M minimalno
pokrivajuće stablo, to znači da ne može postojati drugo pokrivajuće stablo koje je
od njega lakše. Zato mora biti w(M ′ ) = w(M). Odavde se vidi da je i M ′ minimalno
pokrivajuće stablo grafa G.
Dakle, za svako k = 0, 1, . . . , n − 1 postoji minimalno pokrivajuće stablo koje
kao svoj podgraf sadrži graf Tk . Zato, postoji minimalno pokrivajuće stablo M koje
kao svoj podgraf sadrži graf Tn−1 . Kako i M i Tn−1 imaju po n čvorova i n − 1
granu i kako je Tn−1 podgraf od M, mora biti Tn−1 = M. Zato je Tn−1 minimalno
pokrivajuće stablo grafa G.
da planira unapred, da dublje analizira situaciju, već grabi granu koja je u tom tre-
nutku najpovoljnija. Reklo bi se da je ogromna sreća da na kraju dobijemo baš ono
što nam je trebalo!
Algoritmi koji ne planiraju ništa unapred, već grabe ono što je u tom trenutku
najpovoljnije zovu se pohlepni algoritmi (engl. greedy algorithms). Nema mnogo
problema kod kojih pohlepni algoritmi daju optimalna rešenja. U mnogim situ-
acijama (npr. kao u šahu) ponekad je potrebno uraditi nešto što u tom trenutku
ne deluje najpovoljnije, a kasnije se ispostavi da je to bilo mudro i da zbog toga
možemo dobiti optimalno rešenje.
Zadaci za vežbu
4.1. Za težinski graf kažemo da je magičan ako postoji konstanta k takva da za
svaki čvor v, suma težina grana koje su incidentne sa v jednaka je k. Napi-
sati metod magican koji za dati težinski graf utvrduje da li je on magičan.
4.2. Napisati metod tezinaPodgrafa koji za dati težinski graf G i skup čvorova
S ⊆ V (G) odreduje zbir težina svih grana čija oba kraja su u S.
4.3. Ekscentricitet čvora v u težinskom grafu G je najveće moguće rastoja-
nje od čvora v do nekog drugog čvora u grafu. Čvor v je centralni čvor
težinskog grafa G ako ima najmanji mogući ekscentricitet. Napisati pro-
gram koji za dati težinski graf G odreduje skup svih njegovih centralnih
čvorova.
4.4. Napisati program koji za običan, dakle ne težinski, graf G odreduje sve
parove (x, y) čvorova sa osobinom da postoji šetnja dužine tačno k koja
spaja x sa y. Primetimo da u tom slučaju možda postoji i kraća šetnja, ali
to nije bitno.
(Uputstvo: Neka je A matrica susedstva grafa G. Šta predstavljaju elementi
matrice A2 ? Matrice A3 ? . . . Matrice Ak ?)
4.5. Napisati program koji za običan, dakle ne težinski, graf G računa matricu
D = [di j ] logičkih vrednosti tako da je
di j = true ako i samo ako postoji put od i do j u G.