Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Grafy i Zastosowania
6: Najkrótsze ±cie»ki c Marcin SydowGrafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Spis zagadnie«
Problem najkrótszych ±cie»ek z jednym ¹ródªem Rozwi¡zanie sznurkowe
Warianty
Relaksacja kraw¦dzi Wariant 1: DAG
Wariant 2: nieujemne kraw¦dzie (Dijkstra) Wariant 3: dowolny graf (Bellman-Ford) Najkrótsze ±cie»ki dla wszystkich par
Zmiana wag grafu na nieujemne przez potencjaªy Algorytm Johnsona
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Problem najkrótszych ±cie»ek
Wej±cie: skierowany graf G = (V , E) z wagami na kraw¦dziach, danymi przez funkcje w : E → R, i wierzchoªek startowy s ∈ V Wyj±cie: dla ka»dego wierzchoªka v ∈ V
dªugo±¢ najkrótszej ±cie»ki µ(s, v) z s do v, je±li istnieje rodzic w drzewie najkrótszych ±cie»ek (je±li istnieje), pozwalaj¡cy zrekonstruowa¢ najkrótsze ±cie»ki z s Najkrótsza ±cie»ka mo»e nie istnie¢ z dwóch powodów:
v mo»e nie by¢ osi¡galny z s
w grae mog¡ istnie¢ ujemne cykle (wtedy mo»e nie by¢ dolnego ograniczenia na dªugo±¢ ±cie»ki)
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Warianty
Przy projektowaniu optymalnego algorytmu, mo»na wzi¡¢ pod uwag¦ pewne specjalne wªasno±ci grafu, np.:
graf jest skierowany, albo nieskierowany
graf jest acykliczny (wtedy mo»na zastosowa¢ najszybszy algorytm)
wagi s¡ nieujemne (wtedy mo»na zastosowa¢ szybszy algorytm)1
Pokazane zostan¡ ró»ne warianty w zale»no±ci od wªasno±ci wej±ciowego grafu
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Najkrótsze ±cie»ki - wªasno±ci
Zaªó»my dla grafu G = (V , E) i wierzchoªków s, v ∈ V nast¦puj¡c¡ konwencj¦: µ(s, v) oznacza dªugo±¢ najkrótszej ±cie»ki z s do v w G, czasami, je±li s jest znane z kontekstu, b¦dziemy pisali krócej µ(v):
µ(s, v) = +∞ (kiedy nie ma ±cie»ki z s do v)
µ(s, v) = −∞ (kiedy istnieje ±cie»ka z s do v zawieraj¡ca ujemny cykl)
µ(s, v) = d ∈ R (w pozostaªych przypadkach) Lemat:
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Obliczanie najkrótszych ±cie»ek: idea
Ogólny pomysª jest podobny do BFS (ze ¹ródªa s). Z ka»dym wierzchoªkiem v zwi¡zujemy 2 atrybuty:
v.distance: przechowuje najkrótsz¡ (obecnie znan¡) odlegªo±¢ z s do v
v.parent: przechowuje poprzednika (rodzica) v na najkrótszej ±cie»ce (obecnie znanej) z s
inicjalizacja: s.distance = 0, s.parent = s, a wszystkie pozostaªe wierzchoªki maj¡ atrybut distance ustawiony na +∞oraz parent na null.
Uaktualnienia tych atrybutów s¡ nast¦pnie propagowane przez kraw¦dzie: nazywane jest to relaksacj¡ kraw¦dzi
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Relaksacja kraw¦dzi
%% relax((u,v)) # (u,v) jest kraw¦dzi¡ w grafie
if u.distance + w(u,v) < v.distance v.distance = u.distance + w(u,v) v.parent = u
Algorytmy dokonuj¡ kolejnych relaksacji dopóki najkrótsze ±cie»ki nie zostan¡ obliczone lub ujemny cykl wykryty. Relaksacje maj¡ pewne wa»ne wªasno±ci, np:
(zaªo»ywszy uprzednie dokonanie opisanej inicjalizacji) - po dowolnym ci¡gu relaksacji ∀v ∈ V v.distance ≥ µ(v) czyli, »e warto±¢ distance odkryta przez relaksacje nie mo»e spa±¢ poni»ej prawdziwej warto±ci odlegªo±ci (dowód przez indukcj¦ po liczbie relaksacji kraw¦dzi)
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Poprawno±¢ relaksacji
LemmaPo dokonaniu ci¡gu R relaksacji takiego, »e zawiera on (jako podci¡g) najkrótsz¡ ±cie»k¦ p = (e1, ...,ek) z s do v, zachodzi,
»e: v.distance = µ(s, v) (czyli, »e najkrótsza ±cie»ka zostanie odkryta).
Dowód: Poniewa» p jest najkrótsz¡ ±cie»ka, wi¦c mamy
µ(v) = P1≤j≤kw(ej). Niech vi oznacza koniec kraw¦dzi ei, dla 0 < i ≤ k (v0=s). Poka»emy przez indukcj¦, »e po i-tej relaksacji
zachodzi vi.distance ≤ P1≤j≤iw(ej). Jest to prawda na pocz¡tku
(s.distance == 0). Nast¦pnie, po i-tej relaksacji,
vi.distance ≤ vi−1.distance + w(ei) ≤P1≤j≤iw(ej)(z dencji
relaksacji i na mocy indukcji). Wi¦c po k-tej relaksacji zachodzi: v.distance ≤ µ(v). Ale v.distance nie mo»e by¢ ni»sze ni¢ µ(v) (poprzedni lemat), a wi¦c zachodzi v.distance == µ(v).
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
1: Najkrótsze ±cie»ki w grae acyklicznym (DAG)
Je±li graf jest skierowanym grafem acyklicznym (DAG), to stanowi to bardzo prosty przypadek dla problemu najkrótszych ±cie»ek ze ¹ródªa s.
Ka»dy DAG mo»e by¢ topologicznie posortowany (np. przez DFS) w czasie O(m + n) , co daje ci¡g wierzchoªków (v1, ...,vn). Nast¦pnie, zakªadaj¡c, »e s = vj, dla pewnego 0 < j ≤ n,
mo»na dokona¢ relaksacji wszystkich kraw¦dzi wychodz¡cych z vj, a nast¦pnie wychodz¡cych z vj+1 i tak dalej a» do vn.
W ten sposób ka»da kraw¦d¹ poddana jest relaksacji co najwy»ej raz a ka»da najkrótsza ±cie»ka jest odkryta jako podci¡g ci¡gu dokonanych relaksacji. Poniewa» zªo»ono±¢ czasowa relaksacji jest staªa, wi¦c algorytm ma ª¡czn¡ zªo»ono±¢ O(m + n) w tym przypadku.
UWAGA: wierzchoªki wyst¦puj¡ce przed s w posortowanym ci¡gu s¡ nieosi¡galne z s.
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
2: Algorytm Dijkstry (wagi nieujemne)
Zauwa»my, »e je±li nie ma kraw¦dzi o ujemnych wagach, to nie ma te» ujemnych cykli. Natomiast cykle mog¡ istnie¢, wi¦c nie mo»na zaªo»y¢ wykonalno±ci sortowania topologicznego.
Pomysª algorytmu w tym przypadku polega na dokonywaniu relaksacji w kolejno±ci niemalej¡cych najkrótszych odlegªo±ci od ¹ródªa. Dzi¦ki nieujemno±ci wag, ka»da najkrótsza ±cie»ka zostanie w ten sposób odkryta.
Uwaga: »eby osi¡gn¡¢ powy»sz¡ kolejno±¢, w algorytmie stosowana jest kolejka priorytetowa przechowuj¡ca kolejne wierzchoªki do odwiedzenia (priorytetem jest warto±¢ atrybutu distance)
Przykªad (sznurki z w¦z¦ªkami):
Jest to analogiczne do podnoszenia ze stoªu sznurków
powi¡zanych za pomoc¡ w¦z¦ªków (kolejne podnoszone ze stoªu w¦z¦ªki odpowiadaj¡ wierzchoªkom).
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Algorytm (Dijkstra)
(pq - kolejka priorytetowa z operacj¡ decreaseKey, priorytetem jest warto±¢ atrybutu distance)
s.distance = 0 pq.insert(s) s.parent = s for-each v in V except s: v.distance = INFINITY v.parent = null while(!pq.isEmpty()) scannedNode = pq.delMin() for-each v in scannedNode.adjList:
if (v.distance > scannedNode.distance + w(scannedNode, v)) v.distance = scannedNode.distance + w(scannedNode, v) v.parent = scannedNode
if (pq.contains(v)) pq.decreaseKey(v) else pq.insert(v)
(»eby efektywnie zaimplementowa¢ operacje contains i decreaseKey musimy u»y¢ tzw. adresowalnej kolejki priortytowej, czyli wyposa»onej w dodatkowy sªownik mapuj¡cy wierzchoªki do ich pozycji w kolejce priorytetowej)
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Analiza pesymistczyna algortymu Dijkstry
rozmiar danych: n = |V|, m = |E|
operacja dominuj¡ca: porównanie priorytetów (równie» wewn¡trz kolejki priorytetowej), aktualizacja atrybutów Zªo»ono±¢ gªównej p¦tli zale»y od u»ytej implementacji kolejki priorytetowej.
inicjalizacja: O(n)
p¦tla: O(n × (delMin + insert) + m × decreaseKey) O(nlogn) + O(mlogn) = O((n + m)logn) (dla kopca binarnego)
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Analiza c.d.
Powy»sza analiza dotyczy przypadku pesymistycznego. Mo»na pokaza¢, »e w przypadku przeci¦tnym liczba operacji
decreaseKey wynosi O(nlog(m/n)), co daje przeci¦tn¡ zªo»ono±¢ czasow¡ O(m + nlog(m/n)logn).
Przy dostatecznie g¦stym grae (gdy pierwszy czynnik dominuje nad drugim) otrzymujemy liniowy czas przeci¦tny.
Ponadto, mo»na u»y¢ kopca Fibonacciego, który ma amortyzowany koszt staªy operacji decreaseKey i wtedy otrzymujemy czas pesymistyczny (jednak kopiec Fibonacciego ma ukryt¡ wy»sz¡ staª¡ multiplikatywn¡):
O(m + nlogn)
Ponadto, je±li wagi s¡ caªkowite i ograniczone przez staª¡ C, mo»na zredukowa¢ zªo»ono±¢ pesymistyczn¡ do:
O(m + nC)
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
3: Algorytm Bellmana-Forda (dowolne wagi)
W poprzednich przypadkach wystarczaªo conajwy»ej m relaksacji.
Zawsze jednak wystarcza dokona¢ O(nm) relaksacji, aby odkry¢ ka»d¡ najkrótsz¡ ±cie»k¦ (jako podci¡g). Jest to rodzaj
podej±cia siªowego, które dziaªa dla ka»dego grafu.
Poniewa» dowolna najkrótsza ±cie»ka mo»e zawiera¢ conajwy»ej n − 1 kraw¦dzi spo±ród m, wi¦c wystarczy dokona¢ (n − 1)-krotnej
relaksacji wszystkich m kraw¦dzi ustawionych w ustalony ci¡g, aby ci¡g kraw¦dzi ka»dej najkrótszej ±cie»ki byª w nim zawarty jako podci¡g (i w ten sposób wykry¢ wszystkie dobrze okre±lone najkrótsze ±cie»ki). Dla wierzchoªków nieosi¡galnych b¦dzie v.d == ∞. Aby nast¦pnie wykry¢ jakiekolwiek ujemne cykle, wystarczy nast¦pnie jeszcze raz dokona¢ m relaksacji (te, dla których atrybut d wci¡» maleje, le»¡ na ±cie»kach zawieraj¡cych ujemny cykl) i nast¦pnie w czasie liniowym przypisa¢ wierzchoªkom osi¡galnym z tego cyklu warto±¢ v.d == ∞
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Bellman-Ford's Algorithm
%% (initialise as in Dijkstra) for(i = 1; i <= (n-1); i++) for each e in E relax(e) for each e=(u,v) in Eif (u.distance + w(u,v) < v.distance) identifyNegativeCycle(v)
***
identifyNegativeCycle(v) if (v.distance > -infinity)
v.distance = -infinity for each w in v.adjList
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Najkrótsze ±cie»ki dla wszystkich par
Problem: wej±cie: dany jest graf skierowany z wagami na kraw¦dziach.
wyj±cie: najkrótsze ±cie»ki pomi¦dzy wszystkimi parami wierzchoªków
Rozwi¡zanie 1: wykona¢ Bellmana-Forda ze wszystkich wierzchoªków (O(n2m))
Rozwi¡zanie 2 (szybsze): odpowiednio zamieni¢ wagi na nieujemne (zachowuj¡c najkrótsze ±cie»ki) i wykona¢ algorytm Dijkstry ze wszystkich wierzchoªków (O(n(m + nlogn))) Uwaga: rozwi¡zanie 2 da si¦ wykona¢ tylko je±li nie ma cykli ujemnych.
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Zmiana wag na nieujemne
Aby móc zastosowa« algorytm Dijkstry, w grae zostaj¡ zmienione wagi na nieujemne, tak aby zachowa¢ najkrótsze ±cie»ki. Mianowicie, ka»dej kraw¦dzi e = (v, w) o
dotychczasowej wadze w(e) przypisywana jest nowa waga: w0(e) = w(e) + pot(v) − pot(w),
gdzie pot() jest pewn¡ funkcj¡ nieujemn¡ maj¡c¡ pewne po»¡dane wªasno±ci:
wszystkie nowe wagi s¡ nieujemne
najkrótsze ±cie»ki przy nowych wagach s¡ takie same jak przy starych
sumy wag na cyklach nie ulegaj¡ zmianie
Funkcj¦ speªniaj¡c¡ te warunki nazywamy potencjaªem wierzchoªka.
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Potencjaª wierzchoªka
Aby funkcja pot() speªniaªa powy»sze warunki wyznaczamy j¡ nast¦puj¡co:
dodajemy do grafu pewien sztuczny wierzchoªek s oraz ª¡czymy go kraw¦dziami (skierowanymi) z wagami 0 do wszystkich wierzchoªków grafu
obliczamy najkrótsze odlegªo±ci µ(v) z s do ka»dego wierzchoªka v grafu
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Nowe wagi zachowuj¡ najkrótsze ±cie»ki
Lemat 1:
Je±li p, q s¡ ±cie»kami z v do w, a c(p) oznacza koszt tej ±cie»ki przy oryginalnych wagach, a c0(p) przy nowych wagach, to:
1 c0(p) = pot(v) + c(p) − pot(w)
2 c0(p) ≤ c0(q) wtw c(p) ≤ c(q) (zachowuje porz¡dek
kosztów ±cie»ek)
3 najkrótsze ±cie»ki przy nowych kosztach s¡ takie same jak
przy starych
Dowód: Niech p = (e1, . . . ,ek−1), ei = (vi,vi+1), v = v0 i w = vk. Wtedy:
c0(p) = Pk−1
i=0 w0(ei) =P
0≤i<k(pot(vi) +w(ei) −pot(vi+1)) = pot(v0) +P
0≤i<kw(ei) −pot(vk) =pot(v0) +c(p) − pot(vk)
(a wi¦c zmiana kosztu ±cie»ki zale»y tylko od wierzchoªków ko«cowych) Wynika z tego punkt 2 i 3 Lematu.
Wniosek:
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Nowe wagi s¡ nieujemne
Lemat 2:
Je±li graf nie ma ujemnych cykli i wszystkie wierzchoªki s¡ osi¡galne z s, to przy zdeniowaniu potencjaªu pot(v) = µ(v) (jako dªugo±ci najkrótszej ±cie»ki z s) nowe wagi s¡ nieujemne dla wszystkich kraw¦dzi.
Dowód:
Poniewa» nie ma ujemnych cykli, to wszystkie warto±ci pot(v) s¡ dobrze zdeniowane. Rozwa»my dowoln¡ kraw¦d¹ e = (v, w). Mamy tedy: µ(v) + w(e) ≥ µ(w) (gdy» najkrótsze ±cie»ki speªniaj¡
nierówno±¢ trójk¡ta) a wi¦c: w0(e) = µ(v) + w(e) − µ(w) ≥ 0
Uwaga: czy wag nie mo»na po prostu zwi¦kszy¢ o staª¡ warto±¢, tak aby byªy nieujemne? (podaj odpowiedni kontrprzykªad)
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Pomysª algorytmu Johnsona
Z powy»szych dwóch lematów wynika, »e nowe wagi zachowuj¡ najkrótsze ±cie»ki i pozwalaj¡ zastosowa¢ algorytm Dijkstry. Aby obliczy¢ nowe wagi, nale»y najpierw wykona¢ algorytm Bellmana-Forda z wierzchoªka s aby obliczy¢ warto±¢ µ(v) dla ka»dego wierzchoªka v (przy okazji pozwala on wykry¢
ewentualne ujemne cykle).
Nast¦pnie wykona¢ algorytm Dijkstry z ka»dego wierzchoªka i przywróci¢ poprzednie wagi.
Taki algorytm ma zªo»ono±¢: O(mn) (BF) + O(n(m + nlogn)) (n razy Dijkstra, przy u»yciu kopca Fibonacciego), czyli ª¡cznie: O(nm + n2logn)
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Algorytm Johnsona
%% algorytmJohnsona(){dodaj wierzchoªek s z kraw¦dziami o zerowej wadze do wszystkich wierzchoªków v wykonaj Bellman-Ford aby obliczy¢ najkrótsze ±cie»ki z s
for each node v:
przypisz pot(v) jako odlegªo±¢ od s for each node v:
wykonaj Dijkstra z v na zmienionych wagach (bo s¡ nieujemne)
for each edge e=(u,v):
przywró¢ poprzednie wagi (**)
(poniewa» najkrótsze ±cie»ki s¡ te same) }
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Przykªad: oszacowanie ±rednicy grafu (diam(G))
(przypomnienie: maksymalna odlegªo±¢ pomi¦dzy par¡ wierzchoªków w grae)
Mo»na prosto oszacowa¢ ±rednic¦ grafu nie licz¡c wszystkich par odlegªo±ci na podstawie poni»szej obserwacji:
Lemat:
Niech D0(s) = max
u∈Vµ(s, u), dla pewnego wierzchoªka s
(ekscentryczno±¢ wierzchoªka s).
Je±li graf jest nieskierowany, to zachodzi D0(s) ≤ diam(G) ≤ 2D0(s).
Je±li graf jest skierowany, to powy»sza nierówno±¢ nie zachodzi, ale zachodzi max(D0(s), D00(s)) ≤ D ≤ D0(s) + D00(s), gdzie
D00(s) = max
u∈Vµ(u, s).
Czyli ±rednic¦ mo»na oszacowa¢ przez ekscentryczno±¢ dowolnego wierzchoªka (czyli zªo»ono±¢ liniowa zamiast kwadratowej)
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Podsumowanie
Problem najkrótszych ±cie»ek z jednym ¹ródªem Rozwi¡zanie sznurkowe
Warianty
Relaksacja kraw¦dzi Wariant 1: DAG
Wariant 2: nieujemne kraw¦dzie (Dijkstra) Wariant 3: dowolny graf (Bellman-Ford) Najkrótsze ±cie»ki dla wszystkich par
Zmiana wag grafu na nieujemne przez potencjaªy Algorytm Johnsona
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie
Przykªadowe Zadania
wykonaj efektywny algorytm obliczania najkrótszych ±cie»ek z podanego ¹ródªa dla podanego grafu (najpierw zaklasykuj graf do odpowiedniego przypadku)
dokonaj zmiany wag podanego grafu na nieujemne zachowuj¡c najkrótsze ±cie»ki, zgodnie z przedstawion¡ technik¡ potencjaªów
wykonaj algorytm Johnsona dla podanego grafu oszacuj ±rednic¦ podanego grafu (nieskierowanego lub skierowanego) za pomoc¡ przedstawionej techniki.
Grafy i Zas-tosowania c Marcin Sydow Najkrótsze cie»ki Warianty Relaksacja DAG Algorytm Dijkstry Bellman-Ford Wszystkie pary Podsumowanie Dzi¦kuj¦ za uwag¦