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

Machine Translated by Google

Pogledajte diskusije, statistiku i profile autora za ovu publikaciju na: https://www.researchgate.net/publication/228993896

Hopcroft-Tarjan planarnost algoritam


Članak · Novembar 1993

CITATIONS READS

0 2,516

1 autor:

William Kocay
Univerzitet u Manitobi

96 PUBLIKACIJE 611 CITATI

POGLEDAJTE PROFIL

Neki od autora ove publikacije također rade na ovim srodnim projektima:

Projekat Rekonstrukcija Pogled

Konfiguracije Prikaz projekta

Sav sadržaj koji prati ovu stranicu postavio je William Kocay dana 20. oktobra 2014.

Korisnik je zatražio poboljšanje preuzete datoteke.


Machine Translated by Google

Oktobar, 1993

Hopcroft-Tarjan planarnost algoritam


William Kocay*
Odsjek za kompjuterske nauke,
Univerzitet Manitoba,
Winnipeg, Manitoba, KANADA, R3T 2N2 e-
mail: bkocay@cs.umanitoba.ca

Sažetak
Ovo je ekspozitorni članak o Hopcroft-Tarjan planarnom algoritmu.
Prikazana je grafsko-teorijska analiza verzije algoritma.
Daje se eksplicitna formula za određivanje koji vrh staviti prvi na listu
susjedstva bilo kojeg vrha. Namjera je da se Hopcroft-Tarjan algoritam učini
dostupnijim i intuitivnijim nego što je trenutno.

1. Uvod

Neka je G jednostavan 2-povezan graf sa skupom vrhova V (G) i skupom ivica


E(G). Broj vrhova G je označen sa n. Ako je u, v V (G), tada A(u) označava
skup svih vrhova susjednih u. v u znači da je v susjedno sa u, tako da je v
A(u) (a pošto je G neusmjeren, također u v).
Pogledajte knjigu Bondyja i Murtyja [3] za drugu teorijsku terminologiju
grafova. Hopcroft i Tarjan [13] dali su algoritam linearnog vremena za
određivanje da li je G ravan, koristeći pretragu u dubinu. Pretraživanje po
dubini izračunava dva niza niske tačke za vrhove, L1(u) i L2(u), i dodeljuje
težinu ivicama G, pri čemu se težina izračunava iz nižih tačaka.
Rubovi koji upadaju na svaki u V (G) su tada poređani prema njihovim
težinama. Algoritam zatim koristi revidirani graf u kojem su poređane
incidentne ivice i izvodi još jednu pretragu u dubinu, takozvani PathFinder da
ugradi graf u ravan.
Svrha ovog članka je da objasni zašto je potrebna određena šema
ponderisanja koja se koristi za ivice, da razjasni zašto funkcioniše i da predloži
drugi, intuitivniji način ugradnje grafa u ravan, nakon što je dubina niske
tačke - prva pretraga je izvršena. Hopcroft-Tarjan algoritam je komplikovan i
suptilan. Na primjer, pogledajte njegov opis u Williamsonovom radu [20]. U
[2], Di Battista, Eades, Tamassia i Tollis navode da „Poznati algoritmi planarnosti

* Ovaj rad je podržan operativnim grantom od strane Vijeća za prirodne


nauke i inženjerska istraživanja Kanade.

1
Machine Translated by Google

koji postižu linearnu vremensku složenost teško je razumjeti i implementirati. Ovo


je ozbiljno ograničenje za njihovu upotrebu u praktičnim sistemima.
Jednostavan i efikasan algoritam za testiranje planarnosti grafa i konstruisanje
planarnih reprezentacija bio bi značajan doprinos”.
Možda nije moguće konstruisati jednostavan algoritam planarnosti, ali teorijsko-
grafska analiza algoritma predstavljenog ovdje ima za cilj da algoritam bude lakši
za razumijevanje i implementaciju. Brojni udžbenici o teoriji grafova i algoritmima
su objavljeni od Hopcrofta i Tarjana, od kojih mnogi govore o algoritmima
planarnosti. Knjige Evena [9], Fouldsa [10] i Goulda [12] sve govore o Hopcroft Tarjan
algoritmu, ali nijedna od njih ne pokušava dokazati da algoritam radi, zbog
poteškoća. Knjige Gibonsa [11], McHugha [16], Bondyja i Murtyja [3], te Chartranda
i Oellermanna [5] sve su odlučile da opišu planarni algoritam Demoucrona,
Malgrangea i Pertuiseta [7] jer je konceptualno mnogo lakši za razumevanje nego
Hopcroft Tarjan algoritam. Knjiga Nishizekija i Chibe [17] opisuje algoritam koji su
razvili Lempel, Even, Cederbaum [15] i Booth i Lueker [4], jer je takođe intuitivniji. U
knjizi Williamsona [19], poglavlje o planarnosti završava vježbom 7.31. Od čitaoca se
traži da „pokuša da ubedi najmanje dva prijatelja da vaš algoritam radi u linearnom
vremenu. Velika prepreka će biti uspavljujući efekat na prijatelje”. Vrlo je lako
dokazati da je algoritam zasnovan na pretrazi u dubinu linearan. Teško je dokazati
da Hopcroft-Tarjan algoritam radi. Ovaj rad ima za cilj da Hopcroft-Tarjan algoritam
učini dostupnijim i intuitivnijim.

Razmotrite pretragu G u dubinu. Ona konstruiše ukorijenjeno razapinjuće


stablo T od G, nazvano DF-stablo G. Korijenski čvor je vrh iz kojeg je traženje
započeto. Svaki vrh v V (G), osim korijena, ima jedinstveni vrh pretka, koji je onaj
vrh iz kojeg je DFS(v) pozvan.
Označimo ga sa a(v). Slika 1 prikazuje DF-stablo u grafu G. a(v) je vrh neposredno
iznad v u stablu. Pretraživanje po dubini dodjeljuje numeraciju vrhovima, numeriranje
u dubinu, napisano D(u), gdje je u V (G).
To je redosljed kojim se vrhovi posjećuju pretraživanjem. Vrhovi na slici 1 su
numerisani prema njihovom DF-numerisanju. Rubovi stabla su dati sa E(T) = {uv | u
= a(v)}.

DFS(u: vertex)
{ proširiti DF-pretragu u grafu G od vrha u } započeti

{ DFCount je globalni brojač inicijalno postavljen na 0 }


DFCount := DFCount + 1
D(u) := DFCount

2
Machine Translated by Google

za svaki v u počinje
{ inicijalno, svi D(v) su postavljeni na
0 } ako je D(v) = 0 onda počinje a(v) :=
u
DFS(v)
kraj kraj
kraj { DFS }

1 1

2 8 2
10 3

12 4
3 7 9 5
12
6
11
7
4
6 11 8

5 9 10

Slika 1, DFS u grafu

Drvo T je nacrtano na slici 1 sa korijenom na vrhu, drvo se spušta od


korijena. Listovi T su vrhovi bez potomaka. Počevši od bilo kojeg vrha v u T, niz
v0 = v, v1 = a(v0), v2 = a(v1), . . ., je niz vrhova sa opadajućim DF-brojevima, koji
na kraju dostižu korijenski vrh T. Pretraga u dubinu dijeli ivice G u dvije kategorije.
Ako je uv ivica sa ili a(v) = u ili a(u) = v, onda je uv ivica stabla. Inače uv je list.

Za bilo koji vrh u, napišite S(u) za skup svih potomaka od u, to jest, sve
vrhove v takve da se u javlja na putu od v do korijena. Neka je S (u) = {u}
S(u). Neka je T(u) = {w A(v) | v S (u)}. Riječima, T(u) se sastoji od svih
vrhova susjednih u ili bilo kojeg potomka u. Ako je a(v) = u, grana na u koja sadrži
v je Bu(v) = {wx | w S (v)}, odnosno skup svih ivica incidentnih na v ili bilo
koji potomak v. Ivica uv Bu(v) naziva se stablo grane. U ovom trenutku je
zgodno pratiti [13] ili [9] i prenumerisati vrhove tako da je D(u) = u, odnosno da
se na vrhove pozivamo direktno po njihovom DF-broju. Zatim definiramo L1(u) =
min T(u)

L2(u) = min T(u) {L1(u)}


Kako je G 2-povezan, svaki vrh ima stepen najmanje 2, tako da je |T(u)| 2.
Iz toga slijedi da su donje tačke dobro definirane. Algoritam

3
Machine Translated by Google

ne mogu se direktno odnositi na vrhove po njihovom DF-broju, ali moraju raditi sa


grafom onako kako je zadan. Dakle, algoritam mora izračunati niske tačke kao L1(u)
=x T(u), tako da je D(x) = min{D(v) | v T(u)}
L2(u) = x T(u), tako da je D(x) = min{D(v) | v T(u) {L1(u)}}
Međutim, mnogo je lakše opisati algoritam ako se na vrhove može pozvati preko
njihovog DF-broja. To znači da sva poređenja vrhova kao što je „ako je v < w . . .” mora
se procijeniti preko DF-broja, odnosno „ako je D(v) < D(w). . .”, itd.

Lako je modifikovati DFS za izračunavanje L1(u), a samo je malo teže modifikovati


ga i za izračunavanje L2(u). Pogledajte [13] ili [9] za detalje.
Pretpostavimo da je u = a(v). Tada je u T(v). Stoga L1(v) u. Klasičan je rezultat
Hopcrofta i Tarjana [1] da je u rezni vrh G ako je L1(v) = u, kada u nije korijenski čvor.
Pošto se pretpostavlja da je G 2-povezan graf, on nema vrhove preseka, tako da
možemo zaključiti da je L1(v) < u kad god je u = a(v) i u nije korenski čvor. Iz toga
slijedi da je L2(v) u.

2. Redosled ivica

Graf G je pohranjen po listama susjedstva, naime Adj[u] je povezana lista koja sadrži
sve vrhove susjedne u. Dakle, Adj[u] je uređena lista susjednih vrhova. Ako je v
A(u), onda čvor u Adj[u] koji odgovara v predstavlja rub uv E(G).

Hopcroft i Tarjan dodjeljuju težinu svakoj ivici. Težina se pohranjuje kao polje u
svakom čvoru povezane liste. wtu[v] označava težinu ivice uv u Adj[u]. Može se
definirati na sljedeći način. Pretpostavimo da je v A(u). wtu[v] izračunava DFS(u),
dodavanjem nekoliko naredbi.

ako je uv list sa v < u 2v,


2L1(v), ako je a(v) = u i L2(v) = u
wtu[v] =
2L1(v) + 1, ako je a(v) = u i L2(v) < u 2n + 1 u
suprotnom

Pretraživanje niže tačke u dubinu izračunava D(u), a(u), L1(u), L2(u) i wtu[v], za
sve u V (G) i sve v A(u ). Nazovite ovaj prvi DFS LowPtDFS. Slijedeći ga, težine
rubova su u rasponu 1..2n + 1. Rubovi se zatim sortiraju bucket sortiranjem, a liste
susjedstva Adj[u] se rekonstruišu po rastućem wtu[v]. U Hopcroft-Tarjan algoritmu
druga pretraga u dubinu se tada naziva PathFinder. Koristi preuređene liste
susjedstva za rekurzivno generiranje putanja u grafu i dodaje staze jednu po jednu
da bi izgradio planarno ugrađivanje G. Algoritam je zasnovan na putanjama.

Ovdje je predložena drugačija metoda ugrađivanja G, zasnovana na


ugrađivanju DF-stabla T granu po granu, a ne na ugrađivanju staza. The

4
Machine Translated by Google

razlog za to je što je struktura stabala rekurzivna u smislu njihovih grana. Ova


rekurzija se može koristiti za davanje teoretskog dokaza grafa indukcijom da
algoritam radi, koristeći grane T. Algoritam je vrlo sličan algoritmu za ugrađivanje
putanja, ali upotreba grana izgleda jednostavnija i matematički je povoljnija.
Prva stvar je razumjeti svrhu i funkciju utega.

Bu(v)

v
u Bu(w)
w
s
x

t
Bu(x)

Slika 2, Grane i listovi na u u DF-drvetu T


Razmotrimo DF-stablo T koje je konstruirao LowPtDFS, shematski nacrtano
u ravni, kao na slici 2, gdje su prikazani samo neki vrhovi i ivice. Rubovi stabla su
podebljani. Na u postoje dva lista, ua i ub, i tri grane Bu(v), Bu(w), Bu(x) sa
stabljikama uv, uw i ux. Listovi ua i ub imaju težine wtu[a] = 2a i wtu[b] = 2b,
pošto su težine listova određene njihovim krajnjim tačkama. Da biste izračunali
težinu stabljika, uočite da je L1(x) = r i L2(x) = u, tako da je wtu[x] = 2r, gdje je r
korijenski vrh. L1(v) = a i L2(v) = b < u, pa je wtu[v] = 2a+1. L1(w) = b i L2(w) = u,
tako da je wtu[w] = 2b. Graf treba da ugradi drugi DFS koji prelazi T rekurzivno,
ugrađujući grane i listove. Ugrađivanje se odvija spolja unutra. Na vrhu u oni su
ugrađeni u red Bu(x), ua, Bu(v), ub i Bu(w), budući da je wtu[x] = 2r < wtu[a] = 2a
< wtu[v] = 2a+1 < wtu[b] = 2b = wtu[w].

Ugrađivanje grane poput Bu(v) sa L1(v) = a je vrlo slično ugrađivanju lista


ua. U stvari, ako ubacimo vrh stepena dva na vijenac ua, on se ponaša baš kao
grana čija je L1-vrijednost jednaka a. Zbog toga je težina lista određena njegovom
krajnjom tačkom, a težina grane donjom tačkom vrha stabljike. Jer će L2(v) < u

5
Machine Translated by Google

biti drugi listovi unutar grane između u i a. Stoga ne možemo znati dok posjećujemo
u da li bi bilo moguće ugraditi list ua nakon što je Bu[v] ugrađen. Stoga se list mora
ugraditi prije grane. Zbog toga je listovima data težina 2a, a težina stabljike 2a + 1.

Grana poput Bu(w) ima L2(w) = u. Stoga, nakon što je grana ugrađena, i dalje će
biti moguće ugraditi list ub, gdje je b = L1(w) unutar grane. Redoslijed ugradnje
listova i grana još uvijek nije određen. Stoga im se daje jednaka težina 2b. Dakle,
grane su poredane prema L1-vrijednosti vrha stabljike.

Svrha L2-vrijednosti je razlikovanje dva tipa grana. Faktor 2 u izračunavanju težine je


da se napravi razlika između grana čija je L2-vrijednost manja od u, ili jednaka u,
čineći njihovu težinu neparnom ili parnom, respektivno.

2.1 Definicija. Grana Bu(v), gdje je u = a(v), sa L2(v) = u naziva se granom tipa I. Ako je
L2(v) < u naziva se grana tipa II.
Dakle, na vrhu u, redosled Adj[u] definisanog težinama postavlja listove i grane
tipa I ispred grana tipa II sa istom L1- vrednošću. List se ponaša kao grana tipa I.
Definicija wt dodjeljuje wtu[v] = 2n + 1 za neke rubove uv. To su ili listovi prema dolje,
odnosno listovi gdje je v > u, ili ivice stabala sa a(u) = v. One su ugrađene iz njihove
druge krajnje tačke, pa se mogu zanemariti dok posjećujete u. Tako im se daje težina
koja ih stavlja iza svih ostalih listova i grana.

3. Tačke grananja T

Neka je T DF-stablo koje je konstruirao DFS. DFS počinje u korijenu T. Spušta se niz
stablo rekurzivnim pozivanjem sebe. Dok posjećujete čvor u, DFS(v) se može pozvati
rekurzivno za nekoliko v Adj[u].
3.1 Definicija. Vrh u je tačka grananja T, ako T ima granu Bu(v) gde v Adj[u] nije
prvi vrh Adj[u]. Koren T je takođe tačka grananja. S obzirom na bilo koje v u T,
definiramo b(v), tačku grananja v kako slijedi.

1) b(v) = v, ako je v korijen T; 2) ako v


nije korijen, neka je u = a(v).

b(v) = nb(u),
u ako jeinače.
v prvi čvor Adj[u];
Dakle, tačke grananja datog DF-stabla T zavise od toga koji je čvor prvi na listama
susjedstva. Budući da je niz u1 = a(v), u2 = a(u1), . . . na kraju dostigne korijen, b(v) je
jedinstveno definiran i uvijek je tačka grananja T. Lako se izračunava pomoću DFS-a
koji je pokrenut iz korijena T.

6
Machine Translated by Google

DFS(u: vrh)
{ DFS za izračunavanje tačaka grananja postojećeg DF-stabla
T } { b(u) je već poznato } početi

FirstTime := true { označava prvi v Adj[u] }


{ a(u), D(u) je izračunao prethodni DFS } za svaki v
Adj[u] počinje ako je a(v) = u tada begin { silazi stablo }
if FirstTime then b(v) := b(u) else b(v) := u

DFS(v)
kraj
Prvi put := false
end end { DFS }

LowPtDFS ne može izračunati tačke grananja. To je zato što tačke


grananja zavise od redosleda Adj[u], a to se ne određuje sve dok se
LowPtDFS ne izvrši. S obzirom na DF-stablo T i bilo koji redoslijed lista
susjedstva, tada se određuje skup tačaka grananja T. Sljedeći DFS
koristeći promijenjeni Adj[u] će se spustiti na isto stablo T, iako će grane
biti pretraživane po redoslijedu koji odredi Adj[u].

Neka je L(T) = {v | prvi w Adj[v] odgovara listu vw}.


Jasno je da L(T) sadrži sve listove T. Može sadržavati i druge vrhove koji
nisu listovi. Ako v L(T) nije list, onda je v uvijek tačka grananja T. Za
svaki v L(T), neka Pv označava put u T od v do b(v).
Dužina putanje je `(Pv), broj ivica u putanji.
Pozivajući se na Sliku 2, grane na u su poredane po težinama kao
Bu(x), Bu(v) i Bu(w). Tačke grananja su tada sljedeće: b(x) = r, b(v) = u,
b(w) = u, b(u) = r, b(c) = r, itd. Tačke grananja dijele drvo u staze. Na slici
2, L(T) se sastoji od listova {c, s, t}, a putanje Pc, Ps i Pt zajedno sadrže
sav T.

3.2 Lema. Neka je T DF-stablo od G, sa tačkama grananja definisanim


uređenim listama susjedstva G. Tada je {Pv | v L(T)} je particija T na
staze.
Dokaz. Indukcijom na |L(T)|. Neka r označava korijen T. Ako je L(T) = {v},
tada je v list i T = Pv, put od v do r. Pretpostavimo da je |L(T)| = k, gdje je
k > 1. Neka je v posljednji posjećeni list i neka je u = b(v). Odaberite w
Pv tako da je a(w) = u. Tada je T = T Pv DF-stablo
0
sa |L(T 0)|za
= graf
k 1.
G Jasno
S je(w)
da
je L(T 0) = L(T) v. Dakle

7
Machine Translated by Google

{Px | x L(T 0)} {Pv} je podjela T na putanje. Slijedi lema.

Na vrhu u u T, prvi čvor v Adj[u] je ključan za uspjeh algoritma. Zbog toga


su tačke grananja važne. Kada je uv ivica stabla, DFS nastavlja da se spušta niz
stablo. Kada je uv list, spuštanje se zaustavlja. U ovom slučaju put Pu u T od u do
b(u), plus lišće uv je putanja koju je pronašao PathFinder DFS Hopcrofta i Tarjana
[13]. Oni takođe smatraju da je svaki list put dužine jedan. Hopcroft i Tarjan
ugrađuju G u ravan ugrađujući ove putanje jednu po jednu.

Na algoritam gledamo iz malo drugačije perspektive. Koristimo DFS da


ugradimo G granu po granu T. Lišće uv, gdje je v < u, ugrađeno je ili na lijevoj
strani T ili na desnoj strani. Dakle, imamo ugrađivanje T u ravan, sa listovima
raspoređenim oko T dajući ugradnju G. Prvo određujemo redosled Adj[u] tako
da tačke grananja garantuju da dozvoljavaju ugrađivanje kada je G ravan.

Zatim, nakon Hopcrofta i Tarjana, čuvamo dvije povezane liste listova, LF i RF


koje sadrže listove i grane ugrađene lijevo od T i desno od T, respektivno. LF i RF
se mogu posmatrati kao hrpe, čiji vrhovi sadrže broj vrha koji trenutno označava
gornju granicu u stablu u koju se listovi mogu ugraditi. Kao prvu aproksimaciju
imamo

EmbedBranch(u: vertex)
počinje
{ NonPlanar je globalna zastava }
za svaki v Adj[u] do begin
NonPlanar := true { pretpostavimo da će G biti neplanarno } ako
je a(v) = u onda počinje { uv je ivica drveta }
ako je b(v) = u onda
započni { uv počinje novu granu na
u } ako je L1(v) premali da bi dozvolio ugrađivanje, onda
izađi postavi Bu(v) na LF ili RF kraj

EmbedBranch(v)
ako je NonPlanar onda
Exit end else if v < u onda
počinje { uv is a frond }
EmbedFrond(u, v)
ako je EmbedFrond neuspješan onda Exit
end end

NonPlanar := false { nisu pronađeni konfliktni listovi }


kraj { EmbedBranch }

8
Machine Translated by Google

EmbedFrond je postupak koji pokušava ugraditi frond uv postavljanjem na LF ili


RF. Vraća logičku vrijednost koja pokazuje da li je uv uspješno ugrađen.

4. Poređanje lista susjedstva

Redosled Adj[u] po težinama nije dovoljan da garantuje da je ugrađivanje


moguće bez daljeg usavršavanja. Predstavljamo nekoliko primjera.

1 1

2
2
3
7
7 4
3
6
5
5 4
6

Slika 3, Primjer 1

Primjer 1 pokazuje dva pokušaja ugradnje istog grafa. Stablo T je isto u oba
pokušaja, ali se redoslijed grana razlikuje. U primeru sa leve strane, liste
susednosti su poredane striktno prema izračunatim težinama. Na desnoj strani
redoslijed je malo izmijenjen. Grane i listovi su u svakom slučaju isti. Na vrhu 3,
B3(4) je grana tipa I sa wt3[4] = 2. Postoji list (3,1) sa wt3[1] = 2. U lijevom
primjeru, list je prvo ugrađen, a zatim grana, čime se grana tjera unutar lista na
lijevoj strani T.

U desnom primjeru, grana B3(4) je ugrađena prije lista. Na vrhu 4 nalazi se


grana tipa II B4(5) težine 3. Tu je i list (4,1) težine 2. Na lijevoj strani je prvi
umetnut list; na desnoj strani se prvo uzima grana. Na vrhu 5 postoje dvije
grane tipa II, B5(6) i B5(7). Oba imaju težinu 3. Tu je i list (5,1) težine 2.

Na lijevoj strani, prvo se uzima list, zatim B5(6), zatim B5(7); na desnoj strani se
prvo uzima B5(6), zatim list, zatim B5(7). Ono što treba primijetiti je da je u
primjeru lijevo nemoguće ugraditi B5(7) bez prisilnog prelaska ivice (6,3). Dakle,
redoslijed Adj[u] po težinama mora biti prilagođen da bi se ovaj graf uspješno
ugradio.

9
Machine Translated by Google

1 1

2 2

3 3
7 6

5 5

4 4

6 7

Slika 4, Primjer 2

Primjer 2 također pokazuje dva pokušaja ugrađivanja grafa. Na vrhu 3 postoje


dvije grane tipa II, B3(4) i B3(5), težine 3. U oba slučaja prvo se uzima B3(4). Na
vrhu 5 također postoje dvije grane tipa II, B5(6) i B5(7), obje težine 3. Na lijevoj
strani se prvo uzima B5(6). Tada nalazimo da se B5(7) ne može ugraditi bez prelaska
ivice (6,2).
Desno se prvo uzima B5(7). Obratite pažnju da na dijagramu sa leve strane
pomeranje B5(7) na drugu stranu putanje od 3 do 6 nije dozvoljeno, jer bi to
promenilo tačke grananja stabla. Ovo je ekvivalentno preuređivanju susednih lista,
što bi onda moglo uticati na deo grane B3(5) koji je već pređen u toj tački.

Primjer 3 prikazuje graf koji je uspješno ugrađen u ravan. U vertexu 3 nalazi


se grana tipa I B3(4) sa wt3[4] = 2 i grana tipa II B3(5) sa wt3[5] = 3. Prvo se uzima
grana tipa I, a grana tipa II se zatim ugrađuje u lice koje stvara list (4,1). Na
verteksu 9 nalazi se grana tipa I B9(10) i grana tipa II B9(11). Opet se prva uzima
grana tipa I. Na vrhu 15 nalazi se list (15,1) sa wt15[1] = 2 i grana tipa II B15(16).
Prvi se uzima list. Vraćajući se na stablo, ugrađuje se nekoliko manjih grana, sve
uspješno.

Ono što treba primijetiti je da na vrhu 15, da je grana B15(16) bila ugrađena prije
lista, tada bi bilo nemoguće ugraditi manje grane pri vraćanju uz stablo bez
uvođenja ukrštanja.
Dakle, list mora biti prvi.

10
Machine Translated by Google

5 3
16 19

15 14 11 9
18
4
17
10

Slika 5, Primjer 3

Primjer 4 pokazuje vrlo sličan graf koji je uspješno ugrađen u ravan. Kao
u primjeru 3 postoje dvije grane na vrhu 3, od kojih se prva uzima grana tipa
I. Na vrhu 9 opet postoje dvije grane i prva se uzima grana tipa I. Na vrhu 15
nalazi se list (15,1) i grana tipa II B15(16). Ovaj put se prvo uzima grana, a
manje grane se zatim uspješno ugrađuju kada se vraćaju na stablo.

Grana se mora ugraditi prije lista. Ako se prvi uzme lišće (15,1) ne bi bilo
moguće ugraditi manje grane bez uvođenja križanja.

19 5 3
17
16 15 11 9
14 18
4
10

Slika 6, Primjer 4

11
Machine Translated by Google

4.1 Definicija. Neka je T DF-stablo u grafu G. Definiramo dvije cjelobrojne funkcije N(v)
i N0(v) za svaki v V (G) kako slijedi.
1) Ako je v korijen od T onda je N(v) = N0(v) = 0.
Inače neka je u = a(v).
2) Ako je Bu(v) grana tipa I onda je N(v) = N0(v) = 0.
3) Ako je Bu(v) grana tipa II, odaberite jedinstveni vrh x takav da
a(x) = L2(v). Tada je L2(v) < x u < v.
3.1) Ako je b(v) = 1 onda je N(v) = 0.
Ako je L2(v) < b(v) onda je N(v) = 1.
Inače L2(v) b(v) 6= 1. Definirati

N(x) + 1, ako je N(x) 6= 0


N(v) = ako je N(x) = 0 i u L1(v) 2,
N(u), ako je N(x) = 0 i u 6 L1(v)

3.2) Ako je b(u) = 1 onda je N0(v) = 0.


Ako je L2(v) < b(u) onda je N0(v) = 1.
Inače L2(v) b(u) 6= 1. Definirati

N(x) + 1, ako je N(x) 6= 0


N 0(v) = ako je N(x) = 0ako
i u 6je N(x)
L1(v)
=0iu L1(v) 2,
N(u),

Definicija N(v) i N0(v) izgleda komplikovano, ali je samo matematička formulacija


jednostavne ideje koja je neophodna da bi se garantovalo da algoritam radi. Može se
izračunati prilično lako, samo slijedeći definiciju. N(v) broji broj koraka potrebnih da
se dođe do temena manjeg od b(v), gdje su koraci zasnovani na listovima do L2(v) ili
L1(v), kako je opisano u nastavku. Ako to nije moguće onda je N(v) = 0. Ako je b(v) = 1
onda ne postoji vrh manji od b(v), pa je N(v) = 0. N0(v) broji potreban broj koraka da
dostignemo vrh manji od b(u). Ako je v prvi čvor u Adj[u], onda je b(v) = b(u), pa je N(v)
= N0(v). Razmotrimo primjer sa slike 6. N(1) = 0. L2(2) = 1, pa je N(2) = 0. L2(3) = 2
b(3), pa je N(3) = 0.

Slično, N(4) = 0. L2(5) = 2 < b(5) = 3, pa je N(5) = 1. L2(6) = 2 < b(6) = 3, pa je N(6) = 1.
L2(7) = 5 b(7) = 3, pa je N(5) = 1+N(6) = 2, pošto je a(6) = 5. Nastavljajući na ovaj
način, imamo N(8) = 2, N(9) = 3, N(10) = 0, N(11) = N(12) = N(13) = N(14) = 1, N(15) =
N(16) = 2 Vidimo da N(v) broji broj koraka potrebnih da se dođe do temena manjeg
od b(v).
Ako je L2(v) < b(v), onda je dovoljan jedan korak, to jest, L2-lišće u Bu(v) spaja se na
vrh < b(v); stoga je N(v) = 1. Ako je Bu(v) grana tipa I onda nije moguće doći do temena
manjeg od b(v) preko L2 funkcije; dakle N(v) = 0 u ovom slučaju. Inače Bu(v) je grana
tipa II sa L2(v) b(v); na primjer na slici 6, L2(7) = 5 > b(7) = 3. U ovom slučaju,

12
Machine Translated by Google

odaberite x gdje je a(x) = L2(v); u ovom primjeru dobijamo x = 6. Nastavljajući s


primjerom, počevši od vrha 7, možemo koristiti dva L2-lista, (18,5) i (19,2), dajući
putanju (7,8,18,5 ,6,19,2) do vrha 2 < b(7) = 3.
Počevši od vrha 9, možemo koristiti tri L2-lista, (12,7), (18,5) i (19,2) da bismo došli do
temena 2 < b(9) = 3. Dakle, N(7) = 2 i N(9) = 3.
N0(v) se razlikuje od N(v) samo po upotrebi b(u) u poređenju umjesto b(v). Dakle,
N(v) = N0(v) kada je v prvi čvor na listi susjedstva. Kada v nije prvi čvor, N0(v) je
vrijednost koju bi N(v) imao da je v prvi čvor. N0(v) se koristi za određivanje ispravnog
reda Adj[u]. Zaista želimo N0(v), ali pošto je N0(v) definisan u terminima N(v), moramo
izračunati i N(v).

Funkcije N(v) i N0(v) se lako mogu izračunati dodavanjem nekoliko iskaza po


uzoru na definiciju 4.1 u DFS odjeljka 3 koji izračunava tačke grananja. N(v) i N0(v)
zavise od tačaka grananja onih vrhova T koji su preci v. Tačke grananja zavise od
redosleda lista susednosti. N0(v) se koristi za preuređenje lista susjedstva. U početku,
Adj[u] je uređen prema težinskoj funkciji wtu[v]. Nadalje, pretpostavljamo da ako v, w
Adj[u] imaju jednaku težinu, gdje je uv list, a uw stabljika grane, da v prethodi w u
listi susjedstva. To jest, pretpostavljamo da listovi prethode granama jednake težine.
Ovo se lako može postići kod sortiranja u kanti stavljanjem listova na vrh kante i
stabljika grana na repu kante.

Neka v biti prvi vrh Adj[u], i neka je W najmanji neparni broj wtu[v ]. Neka
je A (u) = {v Adj[u] | wtu[v] W}. A (u) predstavlja sve grane tipa I i tipa II na u
sa L1-vrijednošću = bW/2c (i eventualno listom na u do temena bW/2c). Sada
izračunavamo N0(v) za svaki v A (u) i prilagođavamo redosled Adj[u] prema
sledećem pravilu.

4.2 Pravilo.
1) Ako postoji av A (u) takav da je Bu(v) grana tipa II za koju je N0(v) paran, tada
se v pomiče u glavu Adj[u]. (Ako postoji više od jednog takvog v, samo jedan od
njih se pomiče.)
2) U suprotnom, ako postoji av A (u) takav da je Bu(v) grana tipa I, tada se v
pomjera u glavu Adj[u]. (Ako postoji više od jednog takvog v, samo jedan od njih
se pomiče.)
3) U suprotnom Adj[u] je nepromijenjen.

Izračunavanje N0(v) i podešavanje redosleda Adj[u] se postiže pomoću DFS-a koji


izračunava tačke grananja T, pošto poredak lista susednosti utiče na tačke grananja.
Ako je x jedinstveni vrh takav da je a(x) = w, za neki vrh w, onda moramo biti u stanju
pronaći x, dat w. Rub wx je stabljika grane Bw(x) na w.

Najlakši način da pronađete x je da algoritam održava niz Stem[w],

13
Machine Translated by Google

za vrhove w.

GranaPtDFS(u: vrh)
{ DFS za izračunavanje b(v) i N(v), za sve v Adj[u], i za } { reorder
Adj[u]. Nakon unosa b(w) i N(w) su poznati, } { gdje je w u ili bilo koji
predak u } počinje v := prvi vrh Adj[u]

W := wtu[v]
ako je W paran onda W := W + 1
vI := 0; vII := 0 { markeri za grane tipa I i II } za svaki v Adj[u]
tako da wtu[v] W počinje ako a(v) = u onda počinje { uv je ivica
drveta }
N(v) := 0 { pretpostavimo da će N(v) biti 0 }
ako je wtu[v] paran onda vI := v { Bu(v) je tip I grana } inače počinje
{ Bu(v) je tip II grana } ako je L2(v) < b(u) onda N(v) := 1 inače ako je
b(u) 6= 1 onda počinje x := Stem[L2(v)] ako je N(x) 6= 0 onda N(v)
= N(x) + 1 inače ako je u L1(v) onda N(v) := 2 drugo N(v) = N(u)

kraj
ako je N(v) paran onda početak vII := v; idi na 1; end
end end { if a(v) = u } end { for } 1: ako je vII 6= 0 onda
stavite vII na čelo Adj[u]

inače ako je vI 6= 0 onda stavite vI na čelo Adj[u]


{ Adj[u] je sada preuređen, spusti se T }
FirstTime := true { označava prvo v Adj[u] } za svaki v
Adj[u] počinje ako je a(v) = u onda počinje

b(v) := u { pretpostavimo da će tačka grananja biti u }


ako je prvi put onda b(v) := b(u) inače ako je wtu[v]
paran onda N(v) := 0 { tip I grana } ostalo N(v) := 1 { tip II grana }

Stem[u] := v { dodijeli stablo za granu koja će se tražiti }


BranchPtDFS(v) kraj

FirstTime := false
end end { BranchPtDFS }

14
Machine Translated by Google

4.3 Lema. BranchPtDFS izračunava b(v) i N(v) ispravno, za sve v V (G).

Dokaz. Indukcijom na broj nivoa rekurzije. Pošto smo identificirali vrhove sa


njihovim DF-brojem, korijen je vrh 1. Moramo dodijeliti b(1) := 1 i N(1) := 0 prije
nego što pozovemo BranchPtDFS(1). Tako je tačno sa 0 nivoa rekurzije.
Pretpostavimo da je tačno do k nivoa rekurzije, i neka je u vrh posjećen na (k
1)-tom nivou rekurzije, gdje je k 1.
Prva for-petlja algoritma uzima svaki v A (u) redom, ako je uv ivica stabla.
Inicijalizira N(v) := 0. Ako je Bu(v) grana tipa I, ostavlja N(v) sa vrijednošću 0,
što je tačno. Zapisuje vrh v u vrijednost vI . Ako je Bu(v) grana tipa II, ona
upoređuje L2(v) sa b(u). Ako je L2(v) manji, postavlja se N(v) = 1. Ovo je
vrijednost N0(v). Ako je b(u) = 1, vrijednost N(v) ostaje 0. U suprotnom, ako je
L2(v) veći od b(u), pronalazi x kao u definiciji 4.1. Vrijednost data N(v) je tada
jedna od N(x) + 1, 2 ili N(u), kao u 4.1. Ovo je opet vrijednost N0(v). Ako je N0(v)
paran, bilježi vrh v u vrijednost vII. Dakle, nakon što je for-petlja izvršena, N(v)
sadrži vrijednost N0(v).

U ovom trenutku jedan od vI ili VII se može pomeriti u glavu Adj[u]. Pošto
je N(v) = N0(v) kada je v prvi čvor u Adj[u], N(v) ima tačnu vrijednost za prvi
vrh na listi. Takođe postavlja b(v) = b(u) za prvi čvor na listi, ako je uv ivica
stabla. Svi preostali rubovi stabla uv imaju b(v) = u, i N(v) = 0 ili 1, u zavisnosti
od toga da pripadaju granama tipa I ili II, respektivno. Ovo su vrijednosti koje
algoritam dodjeljuje. Iz toga slijedi da su b(v) i N(v) ispravno izračunati za svaki
v Adj[u] gdje je uv ivica stabla. Zatim rekurzivno poziva BranchPtDFS. Stoga
je lema tačna za svaki čvor posjećen na k nivou rekurzije. Po indukciji to važi
th
za sve nivoe.

5. Graf-teorijska analiza algoritma, |L(T)| = 1.


Preuređenje Adj[u] u skladu sa pravilom 4.2 je upravo ono što je potrebno da
bi se garantovalo da će algoritam EmbedBranch biti uspešan kad god je G
ravan. Dokaz je indukcijom na n (broj vrhova G) i na |L(T)|. Pretpostavljamo
da je G 2-povezan graf i da je n 3.

Pretpostavimo prvo da je |L(T)| = 1. Neka je L(T) = {v}, i neka r označava


korijen T. Pošto je G 2-povezan, prvi vrh u Adj[v] je r, koji predstavlja list do
korijena T. Bez gubitak opštosti vr će biti ugrađen na levu stranu T. Ciklus C
formiran od vr i Pv deli ravan na dva regiona, unutar i izvan C. Algoritam
održava dve povezane liste listova, LF i RF (napomena da je povezana lista niz).

Bez gubitka općenitosti, možemo pretpostaviti da se lijeva strana T odnosi na


unutrašnju regiju, a desna na vanjsku regiju C. Svaki list

15
Machine Translated by Google

treba postaviti ili u LF ili RF. Hopcroft i Tarjan koriste ove povezane liste
kao hrpe i odbacuju listove koji više ne mogu imati efekta na preostali
dio algoritma. Ali korisno je zadržati cijelu povezanu listu. Neka je LF =
(f1, f2, f3, . . .) i RF = (g1, g2, g3, . . .). Listovi su poredani prema njihovoj
manjoj krajnjoj tački, naime, ako je fi = aibi gdje je ai < bi i slično za RF.
Kao što, tada
ćemo a1vidjeti,
a2 nizovi
a3 . .LF
., i određuju
RF konstruirani algoritmom
kombinatorno u potpunosti
ugrađivanje G
u ravan. Stoga, kada kažemo da algoritam ugrađuje G u ravan, mislimo
da konstruiše liste LF i RF.

5.1 Definicija. Ako su xy i wz dva lista takva da je x < w < y < z onda ne mogu oba
biti na istoj strani C. Zovu se konfliktni listovi. Frond graf G i T označen je F G.
Njegovi vrhovi su listovi G. Dva lista su susjedna ako se sukobljavaju.

5.2 Lema. Ako je G ravan i |L(T)| = 1, tada je FG bipartitni graf.

Dokaz. V (FG) se može podijeliti na one listove unutar C i one izvan C. Pošto je G
ravan, nema konfliktnih listova ni unutar C ni oba izvan C. Stoga je FG bipartitan.

Iz toga slijedi da FG ne sadrži neparne cikluse. Općenito, gornji graf će se


sastojati od niza povezanih komponenti F1, F2, . . ., Fm. (Hopcroft i Tarjan svaki
nazivaju Fi
blokom
listova.) Za svako i, neka (Li , Ri) bude biparticija Fi gdje se Li sastoji od onih listova
Fi koji su ugrađeni,naT. lijevoj
Biparticija
strani
( T,Lia, Ri Ri)
onihFGlistova
nije jedinstvena
ugrađenihako
na desnu
je m > stranu
1, jer
možemo zamijeniti Li i Ri u bilo kojem Fi da dobijemo drugu biparticiju FG koja
odgovara drugom ugrađivanju G. Ovo je ono što Hopcroft i Tarjan nazivaju
prebacivanjem strana.

Dijagram prikazuje DF-stablo T za koje FG ima 4 komponente, označene


senčenjem linija. Očigledno je ugniježđenje komponenti.

16
Machine Translated by Google

Slika 7, Komponente lisnog grafa, |L(T)| = 1.

U početku FG = Ø. Kako bi se izbjegla situacija kada je FG = LF = RF = Ø


zgodno je kreirati dva "lažna" lista f0 = (0, n) i g0 = (0, n), i "lažna" komponenta
F0 za koju je L0 = {f0} i R0 = {g0}.
Algoritam spušta T do lista v. Svi listovi su ugrađeni dok se EmbedBranch ponovo
uzdiže T. Kako su listovi dodijeljeni ili LF ili RF, FG se postepeno konstruiše. Prvi
ugrađeni list je vr. Bez gubitka općenitosti, algoritam će prvo pokušati postaviti
list s lijeve strane, ako je moguće. Dakle, algoritam će postaviti f1 = vr. Neka ui
označava minimalni vrh bilo kog lista u Li , naime ui = min{a | ab Li}. Slično
vi = max{a | ab Li}, xi = min{a | ab Ri}, i yi = max{a | ab Ri}.

Ako se Fi sastoji od jednog lista, onda će Ri biti prazan, tako da xi i yi nisu uvijek
definirani. U ovom slučaju uzimamo xi = n i yi = 0. Na ovaj način će većina
nejednakosti biti zadovoljena čak i kada je Ri = Ø. Svaki Fi će imati Li 6= Ø. U
smislu DF-numeracije prvi list je f1 = (1, n).
Neka je u vrh T koji posjećuje EmbedBranch kada je list xi u
nailazi se na uw, gdje je w < u. Bilo koja komponenta Fi takva da ui ne ,
može utjecati na preostalo izvođenje algoritma, budući da nijedan preostali list
ne može biti u sukobu s bilo kojim listom Fi . Stoga algoritam ne mora poznavati
sve komponente FG, samo one za koje je u > ui ili u > xi . Neka F0, F1, . . ., Fm
označavaju sve takve komponente, redom
1. Možemo kojim su konstruirane,
pretpostaviti da je u vi gdje je m i, i u
za svako
yi za svako i za koje je Ri 6= Ø, jer su listovi ugrađen dok se penje T.

5.3 Lema. Neka je 1 j m. Svaka komponenta Fj „stane unutar” Fj 1, naime


Fj 1 sadrži list ab takav da je a uj < vj b, a ako je Rj 6= Ø

17
Machine Translated by Google

tada a xj < yj b.
Dokaz. Graf listova je dinamička struktura, koja se mijenja kako su listovi Fm se
Po pretpostavci F1, . . ., što je ui < u vi ilisastoji
xi < uod onih komponenti
yi , gdje za trenutno
je u vrh koji ugrađivanje.
posjećuje EmbedBranch. Wlog, neka uj < u.

Pretpostavimo prvo da je uj 1 uj. Tada je uj < u vj 1. Fj 1 je


povezan, tako da sadrži niz listova koji povezuju uj 1 sa vj 1 i naizmjenično
između Lj 1 i Rj 1. Stoga a < uj < b za neko lice ab ovog niza u Fj 1. Iz toga
slijedi da je vj b i da je a xj < yj b ako je Rj 6= Ø jer Fj nije u sukobu sa
Fj 1.
S druge strane, pretpostavimo da je uj < uj 1. Onda pošto Fj nije u
sukobu sa Fj 1, uj < u vj uj 1 < vj 1. Međutim, barem jedno od ui < u
vi ili xi < u yi vrijedi za svako i, tako da xj 1 < u yj 1 mora vrijediti.
Zatim možemo primijeniti prethodni argument koristeći xj 1 i yj 1 umjesto
uj 1 i vj 1.
Neka ` označava najveći cijeli broj tako da je manja krajnja tačka f` < u i neka
`w označava manju krajnju tačku. Slično, neka r označava najveći cijeli broj tako da
je manja krajnja tačka gr < u i neka rw označava ovu krajnju tačku. Zbog F0
možemo biti sigurni da su ` i r uvijek definirani.
Postoje tri moguće situacije koje se mogu pojaviti za vrh u, kao što je ilustrovano
ispod.

xm
rw
rw

um xm um
rw
lw
lw
u u u
um
xm

vm
ym
ym
ym vm
vm

Slika 8, Situacija temena u u odnosu na Fm, slučajevi 1, 2 i 3

1. u > um i u > xm.


U ovom slučaju Fm sadrži list na um i xm, tako da je u > `w um i u > rw
xm. `w i rw oba pripadaju listovima Fm. 2. u um i u > xm.

U ovom slučaju um u > `w i u > rw xm. `w pripada listu Fi gdje je i <


m. rw pripada listu Fm. Prema lemi 5.3, `w rw.

18
Machine Translated by Google

3. u > um i u xm.
U ovom slučaju u > `w um i xm u > rw. `w pripada lišću
of Fm. rw pripada listu Fi , gdje je i < m. Prema lemi 5.3, rw
`w.
Postoji nekoliko mogućih situacija koje se mogu pojaviti za vrh w.

4. w `w i w rw.
Ovo se može dogoditi u slučajevima 1, 2 ili 3 iznad. uw nije u sukobu sa
bilo koji list LF ili RF. uw je ugrađen na lijevoj strani. Ubacuje se
LR odmah nakon f`. Kreirana je nova komponenta Fm+1 FG
sa um+1 = w i vm+1 = u. Rm+1 = Ø. Vrijednosti m i ` su
povećana za 1.
5. w `w i w < rw.
Ovo se može dogoditi samo u slučajevima 1 i 2 iznad, budući da je `w < rw. uw
sukobljava se sa listom Rm, ali ne i Lm. uw je ugrađen na
lijevo. Dodaje se u Lm i ubacuje u LF odmah nakon f`. ` je
povećano za 1. Ako se primjenjuje slučaj 2, onda uw može biti u sukobu s listom
Fm 1. Postavite um na w i izvršite sljedeće korake:
dok w < xm 1 vrši spajanje(Fm 1, Fm)
Merge(Fm 1, Fm) je procedura koja ažurira vrijednosti um, vm, xm
i ym pohranjeni u strukturama podataka, kako slijedi.

ako je um < um 1 onda um 1 := um


ako je vm > vm 1 onda vm 1 := vm
ako je xm < xm 1 onda xm 1 := xm
ako je ym > ym 1 onda ym 1 := ym
odbaciti Fm
m := m 1

Takođe konceptualno spaja Lm 1 sa Lm, i Rm 1 sa Rm, iako zapravo nije


potrebno eksplicitno pohranjivati ove skupove.

6. w < `w i w rw.
Ovo se može dogoditi samo u slučajevima 1 i 3 iznad, budući da je rw < `w. uw
sukobljava se sa listom Lm, ali ne i sa Rm. uw je ugrađen na
u pravu. Dodaje se u Rm, i ubacuje u RF odmah iza gr. r
se povećava za 1. Ako se primjenjuje slučaj 3, onda uw može biti u sukobu s listom
od Fm 1. Postavite xm na w i izvršite sljedeće korake:
dok w < um 1 vrši spajanje(Fm 1, Fm)
7. w < `w i w < rw.
Ovo se može dogoditi u slučajevima 1, 2 ili 3 iznad. uw sukobi sa listom
LF i RF. Ako je slučaj 1 primjenjiv, onda je G neplanaran, budući da je uw konflikt
sa listovima f` i gr od Fm, stvarajući tako neparan ciklus u Fm.
Izvršite sljedeće korake:

19
Machine Translated by Google

dok w < `w i w < rw počinju


ako je u > um i u > xm (slučaj 1) onda Exit (G nije planaran)
SwitchSides (Lm, Rm)
kraj

SwitchSides je procedura koja razmjenjuje Lm i Rm i ažurira


strukture podataka kako slijedi.

SwitchSides (Lm, Rm)


početi
ako je u um onda počni { case 2 }
dok um 1 > `w spaja (Fm 1, Fm)
`w := rw; ` := r
podesite r tako da gr bude prvi list koji prethodi xm u RF
postaviti rw na manju krajnju tačku gr
end

inače počinje { u > um, slučaj 3 }


dok xm 1 > rw vrši spajanje(Fm 1, Fm) rw :=
`w; r := `
podesite ` tako da f` bude prvi list koji prethodi um u LF
postaviti `w na manju krajnju tačku od f`
kraj

razmijeniti dio povezane liste LF između um i vm sa dijelom RF


između xm i ym. razmjena um i xm, vm i ym, Lm i Rm
spajanje(Fm 1, Fm)

end { SwitchSides }

Dok-petlja će se tada zaustaviti ili sa w `w (slučaj 5) ili w rw


(slučaj 6). U oba slučaja uw se tada može ugraditi.

F1, F2, . . ., Fm su povezane komponente grafa F G. Ako je uw u sukobu


sa Li i Ri , za neke i, onda se uw ne može ugraditi
bez stvaranja neparnog ciklusa u Fi . Stoga je G u ovom slučaju neplanaran.
Inače uw sukobi sa najviše jednim od Li i Ri , za svaki i. TO JE
tada je uvijek moguće ugraditi uw, na primjer razmjenom Li i Ri
za svako i za koje je uw u sukobu sa Ri .

5.4 Lema. Neka |L(T)| = 1. Ako algoritam ide do kraja, onda je G


je planaran.
Dokaz. Ugrađivanje se gradi dodavanjem jednog po jednog lista postojećem
embedding, što je u početku planarno ugrađivanje T. Svaki list je ugrađen bez ukrštanja,
unutar lica postojećeg ugrađivanja. Kada

20
Machine Translated by Google

SwitchSides se izvršava, Lm i Rm se razmjenjuju. Ovo ne uvodi nikakve


prelaze u ugrađivanje. Dakle, ugrađivanje je uvijek planarno, sve do završetka.

Iz toga slijedi da ako je G neplanaran, algoritam neće raditi do kraja. U


dokazivanju da algoritam radi, možemo pretpostaviti da je G ravan.

5.5 Teorema. Ako je G ravan i |L(T)| = 1, algoritam će ugraditi G u ravan.

Dokaz. Pretpostavimo da algoritam ne radi do kraja. Dakle, zaustavlja se dok


posjećujete vrh u sa lišćem uw, w < u, gdje je w < `w i w < rw (slučaj 7). Ako se
primjenjuje slučaj 1 (u > um i u > xm) tada je uw u sukobu sa listom Lm i Rm
tako da se uw ne može ugraditi bez stvaranja neparnog ciklusa u Fm. Dakle,
G u ovom slučaju nije planaran. Ako se primjenjuje slučaj 2 ili 3, tada se
izvršava SwitchSides. uw se sukobljava sa listovima na `w i rw.
Pretpostavimo prvo da se primjenjuje slučaj 2. Tada `w pripada komponenti
Fi gdje i < m i rw pripada Fm. Komponente Fi+1, . . ., Fm ne sadrže
koji listove
su u sukobu
u LF
s uw. Stoga su svi u sukobu sa uw zbog listova u RF. Dvije komponente Fm i
Fm 1 su spojene kada je uw u sukobu s obje. Stoga su komponente FG uvijek
povezane. SwitchSides ih spaja u jednu povezanu komponentu (dok um 1 >
`w radi) pošto su svi u sukobu sa uw, a zatim se razmjenjuju rezultirajući Lm i
Rm . Ovo se radi razmjenom dijelova povezanih lista LF i RF koji pripadaju Lm
i Rm, koristeći um, vm, xm i ym kao pokazivače na povezane liste. U ovom
trenutku u algoritmu m = i + 1. Može biti da je Fi komponenta koja je u sukobu
sa uw u Li i Ri . Algoritam je sada u poziciji da to odredi podešavanjem
vrijednosti `w i rw i poređenjem sa w. Nova vrijednost `w je prethodna
vrijednost rw, pošto je list povezan sa rw pomjeren ulijevo. Nova vrijednost
rw je manja krajnja tačka lista RF neposredno prije Fm. Konačno se spajaju
Fm i Fm 1 .

Ako se primjenjuje slučaj 3, dokaz je vrlo sličan, osim što se desno i lijevo
zamjenjuju. Stoga možemo zaključiti da ako je G ravan, na kraju će sve
komponente Fi koje su u sukobu sa uw u jednom od Li ili Ri biti poravnate
tako da se uw može ugraditi. Slijedi teorema.

Obratite pažnju da je dokaz da algoritam radi kada |L(T)| = 1 ne zahtijeva


pravilo 4.2. Kada je |L(T)| = 1, redosled susednih lista je dovoljan ako se za
redosled listova koristi samo L1-vrednost.

6. Graf-teorijska analiza algoritma, |L(T)| > 1.

21
Machine Translated by Google

Algoritam EmbedBranch u odeljku 3 koristi proceduru EmbedFrond kada se naiđe


na uv-lišće dok se posećuje vertex u. Akcija EmbedFrond(u, v) je opisana u odjeljku
5. Sada kada se naiđe na granu Bu(v), cijela grana mora biti umetnuta ili lijevo ili
desno od T. Grana se ponaša vrlo poput lista uw gdje w = L1(v).

Ako nije moguće ugraditi list uw onda neće biti moguće ugraditi ni Bu(v). Ovo se
može testirati pomoću EmbedFrond(u, w). Ako se uw može ugraditi, recimo na LF,
onda listovi xy od Bu(v) za koje y < u također moraju biti ugrađeni u LF. Oni za koje
x, y u mogu biti ugrađeni u LF ili RF. Postoji vrlo jednostavan uređaj koji se može
koristiti da se to postigne. Pretpostavimo da Bu(v) treba da bude ugrađen u LF.
Ugradite list uw u LF, gdje je w = L1(v). Označite uw kao “lažni list”. Ugradite
“marker grane” uu u RF. Označite to i kao "netačno". Stavite uw i uu u istu
komponentu Fm F G. Svrha lažnog lista uw je da odredi da li ima mjesta za
ugradnju Bu(v). Svrha markera grane uu je da prisili sve listove xy od Bu(v) za koje
je y < u na istu stranu T. Algoritam EmbedBranch se može modificirati zamjenom
grupe iskaza koja počinje „ako je b(v) = u onda počni” sa sljedećim.

ako je b(v) = u onda


počinje { uv počinje novu granu na
u } w := L1(v)
EmbedFrond(u, w)
ako je EmbedFrond neuspješan onda Exit
označi uw kao lažni list ugradi marker grane
uu na strani suprotnoj od uw, u istom Fm

kraj

Definicija 5.1 sukobljenih listova nije dovoljna kada |L(T)| > 1.


Listove, lažne listove i markere grana zajedno nazivamo listovima.

6.1 Definicija. Neka je Bu(v) grana sa markerom grane uu i lažnim listom ut, gdje
je t = L1(v). Neka su xy i wz bilo koji listovi gdje su x > y, w > z i x w. Tada: 1)
Marker grane uu je u sukobu sa odgovarajućim lažnim listom ut; 2) xy i wz su u
sukobu ako je b(x) = b(w) i x > w > y > z; 3) xy i uu su u sukobu ako je b(x) = u, y <
u i xy Bu(v).

Graf listova je označen kao F G. Njegovi vrhovi su listovi G. Dva lista su susjedna
ako se sukobljavaju.

Ako je Bu(v) kao gore, s lažnim listovima ut ugrađenim u LF, tada će bilo koji
list xy od Bu(v) za koji y < u biti u sukobu s markerom grane uu

22
Machine Translated by Google

u RF. Stoga će biti ugrađen u LF kao dio Fm. Lišće xy


, za koje x, y u neće biti u
sukobu sa uu. Biće ugrađen u LF ili RF. Nijedan list xy od Bu(v) neće biti u sukobu
sa lažnim listom ut pošto je b(x) 6= b(u). Ako bude potrebno zamijeniti biparticiju
Fm, cijela grana će se automatski prebaciti.

Najlakši način da se list označi kao lažan je da jednu od njegovih krajnjih


tačaka učinite negativnom, koristite ( u, t) i ( u, u) umjesto u i uu. Program zna
da negativna vrijednost ukazuje na lažni list. Oni postaju stražari na povezanim
listama LF i RF. Na sličan način, Hopcroft i Tarjan koriste "markere kraja steka" da
razgraniče grane T. Lažni listovi su zgodni jer doprinose dokazu da algoritam
radi. Oni čine dio grafa sa strane, koji je još uvijek bipartitan i može se koristiti za
pronalaženje neparnih ciklusa kada je G neplanaran.

6.2 Lema. Ako je G ravan, onda je FG bipartitan.


Dokaz. Ako |L(T)| = 1, definicija 6.1 se svodi na 5.1 i rezultat slijedi sa 5.2. Tvrdimo
da je (LF, RF) biparticija F G. Ako nije, onda će LF, recimo, sadržavati konfliktne ,
listove uv i xy, gdje je u vix y.
Slučaj 1. uv i xy su pravi listovi.
Pošto su b(u) = b(x), uv i xy su u istoj grani, recimo Bz(w), gdje je w = b(u). Prvi st
grane zajedno sa putanjom u T koja povezuje s sa t stvara ciklus C takav da uv i
xy ukrštaju listove oba unutar C. Ali G je ravan, što je kontradikcija.

Slučaj 2. uv je lažni list, xy je pravi list.


Kao iu slučaju 1, uv i xy su u grani Bz(w), gdje je b(u) = b(x) = w, a zadan je ciklus
C. u je tačka grananja Bu(q) koja sadrži lišće do v = L1(q). Ovo stvara dva ukrštanja
puta unutar C, što je kontradikcija.

Slučaj 3. uv je marker grane, xy je pravi list.


Pošto je b(x) = u, xy je sadržano u grani B na u. Marker grane uu koji odgovara B
mora biti u RF, pošto xy LF. Dakle, uv mora biti marker grane za drugu granu,
kontradikcija.
Slučaj 4. uv i xy su lažni listovi.
Ovaj slučaj je skoro identičan slučaju 2.

Slučaj 5. uv je marker grane, xy je lažni list.


Ovaj slučaj je skoro identičan slučaju 3.

Slučaj 6. uv i xy su markeri grana.


Pošto je b(u) = x i b(x) = u, moramo imati u = x = 1, što je kontradikcija.

Znajući da FG mora biti bipartitan, neparni ciklus u FG ukazuje da G nije


planaran. Ovo je ključ za dokazivanje da algoritam radi. Neparni ciklus može
uključivati lažne listove ili markere grana, ali i dalje dokazuje da G nije planaran,
prema lemi 6.2.

23
Machine Translated by Google

Kada se na ovaj način definiše lijevi graf, nije potrebno uvoditi segmente, kao
u [13] ili [19]. Umjesto toga, ugradnja se sastoji od stabla T, zajedno sa njegovim
listovima. FG je uvijek bipartitan. Slično, tačke grananja b(v) zajedno sa putanjama
Pv isključuju potrebu za definiranjem stabla putanja kao u [19].

Ako |L(T)| > 1, izaberite v L(T) gde je v poslednji list T koji je posetio
EmbedBranch. Neka je u = b(v) i neka r označava korijen T. Tada je Pv vu-put, a u
6= r. Neka je uw deblo grane na u koja sadrži v, i postavimo x = a(v). Neka je s =
L1(v). Ovo je ilustrovano u nastavku.

u
w
z

Slika 9, Grana Bu(w) koja sadrži v L(T), `(Pv) > 1.

Dokaz da će algoritam ugraditi G kada |L(T)| > 1 zasniva se na dekompoziciji


G na Bu(w) i G Bu(w), odnosno, T se dekomponuje na Pv i T Pv, kao u lemi 3.2.
Konstruirajte novi graf G0 iz G na sljedeći način. Skupite sve ivice između s i a(u) u
jedan vrh t, i obrišite sve vrhove i ivice osim t i onih od Bu(w). Ovo je ilustrovano na
slici 10. Ako je G ravan, onda je i G0. DF-stablo T od G0 sastoji se od jedne putanje
od v do t. Bilo koji list na u G0 odgovara najmanje jednom listu ay u G, gdje 0jeys< u.

6.3 Lema. Ako je G ravan, onda se G0 može ugraditi tako da su svi listovi do t na
istoj strani od T 0.
Dokaz. Neka F G0 označava graf za G0, sa komponentama F1, F2, . . ., Fm, gdje je
m 1. Ako nije moguće ugraditi G0 sa svim listovima u t na lijevoj strani T 0, tada
zamijenite biparticiju svakog Fi po potrebi, tako da svi listovi yt budu na lijevoj
strani, pri čemu je y > a a što je manje moguće.
Dakle, postoji list na Fi na desnoj strani, za neko i, što ne može biti

24
Machine Translated by Google

pomaknut ulijevo zamjenom biparticije Fi bez dovođenja lista bt udesno, gdje


je b > a. Odaberite b što je manje moguće. Tada nema listova na t između a i
b. Neka je P najkraći put u Fi koji povezuje na Ri sa bt Li . Tada je `(P)
neparan, jer su at i bt na suprotnim stranama T 0. P se sastoji od niza listova
bt, u1v1, u2v2, . . ., ujvj, at, gdje je j = `(P) 1 paran i svaki ukvk je u sukobu sa
uk+1vk+1.
Ovo je ilustrovano sa j = 2. Bez gubitka opštosti možemo izabrati u1v1 tako
da v1 bude što manji. Slično, tada možemo izabrati u2v2 tako da v2 bude što
manji, i tako dalje, bez promjene `(P).

v2 u
v1 a

v2
b u2 v1 a

u1 b u2
v

u1
v

Slika 10, G0 i G, b s
Slučaj 1. bt u G0 ima odgovarajući list sb u G.
Neka je x1 vrh sa a(x1) = b i neka je z vrh sa a(z) = a.
U G, Bb(x1) je grana tipa II koja prethodi lišću sb u Adj[b].
Stoga je N(x1) paran prema pravilu 4.2. Nema listova na t između a i b, tako
da je u G v1 = L2(x1). Slično v2 = L2(x2), gdje je a(x2) = v1, i tako dalje, dok ne
dođemo do vj sa a(xj+1) = vj . Imamo L1(xk) = s i L2(xk) = vk = a(xk+1), za k =
1, 2, . . . , j. Po definiciji 4.1, N(xk) zavisi od N(xk+1).

Pretpostavimo prvo da je a y, gdje je s < y < u. Tada je N(xj+1) = 1,


prema 4.1. Iz toga slijedi da je N(xj ) = N(xj+1) + 1, i tako dalje, sve dok N(x1) =
j + 1, što je neparno, kontradikcija.
Zaključujemo da je s jedini vrh < u susedan a. Kao i lišće. Grana Ba(z)
prethodi kao u Adj[a], tako da je N(z) paran, po pravilu 4.2. Tvrdimo da je N(z)
6= 0. Sada je L2(z) = vj pa N(z) zavisi od N(xj+1). Jedini način na koji bi N(z) = 0
bio moguć je da se primijeni posljednja opcija u tački 3.1 definicije 4.1. Ali to
zahtijeva da a 6 s,

25
Machine Translated by Google

kontradikcija. Dakle, N(z) je paran i 6= 0. Vertex xj leži između uj i a, tako da je


L2(xj ) = L2(z) = vj . Primjenjuje se zadnja opcija u tački 3.1 definicije 4.1, tako
da je N(xj ) = N(z), što je parno. N(xj 1) zavisi od N(xj ).
Ili N(xj 1) = 1 ili N(xj 1) = N(xj )+1, u oba slučaja neparan broj.
Između a i b nema listova na t, tako da na kraju moramo imati N(x1) = N(z) + j
1, neparan broj, što je nemoguće.
Slučaj 2. bt u G0 odgovara by u G, gdje je y > s, s 6 b.
U ovom slučaju, putanja P u F G0 odgovara putanji neparne dužine u FG koja
se povezuje sa lišćem aw koji odgovara at. Pošto su i by i aw u sukobu sa
markerom grananja uu, u F G postoji neparan ciklus. Prema lemi 6.2, G nije
planaran. Primer na slici 11 pokazuje homeomorf K3,3 u G kada je j = 2.
Isprekidani delovi T nisu deo K3,3. Tamno i svijetlo sjenčanje nekih čvorova
ukazuje na biparticiju K3,3.

v2
v1 a

b u2

u1
v

11, G, b 6 s

6.4 Lema. Neka |L(T)| > 1. Ako algoritam ide do kraja, onda je G ravan.

Dokaz. Ugrađivanje se gradi dodavanjem jednog po jednog lista na LF ili RF.


Ako je list uv u sukobu sa listovima i LF i RF u Fm, tada FG sadrži neparan
ciklus, tako da G nije planaran i algoritam se zaustavlja. Ako se ne kreira
neparan ciklus, uv će biti ugrađen unutar lica postojećeg ugrađivanja.

6.5 Teorema. Neka je G 2-povezan planarni graf. Tada će algoritam ugraditi G


u ravan.

26
Machine Translated by Google

Dokaz. Indukcijom na n i |L(T)|. Prema teoremi 5.3, znamo da je teorema tačna


kada je |L(T)| = 1, za sve n. Neka je n > 3 i pretpostavimo da teorema vrijedi za
sve grafove s manje od n vrhova. Neka je k > 1 i pretpostavimo da je teorema
tačna i za sve grafove na n vrhova čije DF-stablo T zadovoljava |L(T)| < k. Neka
G ima n vrhova sa |L(T)| = k.
Kao na slici 9 iznad, r označava korijen T, v L(T) je posljednji list T koji je
posjetio EmbedBranch, u = b(v), a(w) = u, x = a(v) , i s = L1(v).
Bu(w) je posljednja grana posjećena na vrhu u. Neka je z prvi vrh Adj[u]. uz je ili
list ili stabljika grane. U oba slučaja wtu[z] wtu[w] i postoji ciklus C koji sadrži
s, u i z, tako da je cijela grana Bu(w) ugrađena unutar C.

Slučaj 1. `(Pv) > 1.


Skupite rub vx u G i u T da dobijete graf G00 sa stablom T 00. Ako je G ravan
00
onda je i G00. T je DF-stablo od G00,
Stoga je aredoslijed
težine bridova u G00 su iste
lista susjedstva isti kao u G.
u G00 kao u
G, osim eventualno na vrhu x, koji je sada list .

G00 ima n 1 vrh, tako da će algoritam ugraditi G00. Svaki list će biti
postavljen u LF ili RF. Kada je algoritam dat G kao ulaz, izvršenje
EmbedBranch(w) pozvanog iz u je potpuno isto kao u grafu G0 leme
6.1, osim što listovi do vrhova < u moraju biti ugrađeni na lijevoj
strani. Prema lemi 6.1 to se može postići zamjenom biparticije
nekoliko Fi ako je potrebno.
, To je ono što će algoritam učiniti.
Zbog markera grana svi listovi do vrhova < u uvijek će biti na istoj strani T. Stoga
će Bu(w) biti uspješno ugrađen. Preostalo izvršenje algoritma je potpuno isto u
G kao u G00.
Algoritam ne može znati da li je grana Bu(w) koja je upravo ugrađena bila
kontrahirana kao u G00 ili ne, listovi do vrhova < u su identični u oba slučaja.
Dakle, ako je `(Pv) > 1, G će biti uspješno ugrađen u ravan.

s1

s2

v u

Slika 12, Grana Bu(v) kada je `(Pv) = 1

27
Machine Translated by Google

Slučaj 2. `(Pv) = 1.
U ovom slučaju a(v) = b(v) = u. Neka je w = b(u), s1 = L1(v) i s2 = L2(v). Koristite
indukciju na m = deg(v). Ako je m = 2, tada granu Bu(v) možemo zamijeniti jednim
listom us1. Rezultirajući graf ima n 1 vrh, tako da će biti uspješno ugrađen. S
obzirom na G, algoritam će pozvati EmbedBranch(v) na vrhu u prije nego što
ugradi lišće vs1. Ostatak izvršenja će biti identičan, osim što će LF i RF sadržati
dodatni lažni list us1 i marker grane uu, što neće uticati na izvršenje. Dakle, G će
biti ugrađen kada je m = 2. Ako je m > 2, konstruirajte novi graf H iz G zamjenom
Bu(v) sa listom us1 i novom granom B koja sadrži v zajedno sa preostalim m 1
listovima na v. Dakle, u H, deg(v) = m 1, a lišće us1 će prethoditi grani B u
Adj[u]. Po hipotezi indukcije, H će biti uspješno ugrađen. Upoređujemo izvođenje
algoritma zadanih H i G. U H postoje listovi ww, uu, us1, us2 i vs2. U G postoje
ww, uu, us1, vs1 i vs2. Ako su uu i ww ugrađeni na istoj strani u H, tada će
izvođenje algoritma u G biti isto kao u H osim što će svi listovi na v biti ugrađeni
rekurzivnim pozivom EmbedBranch(v). Dakle, ako su uu i ww na istoj strani u H, G
će biti uspješno ugrađen.

Ako je s1, s2 < w, list us1 i lažni list us2 u H su u sukobu sa ww. Pošto je us2
u sukobu sa uu, moramo imati uu i ww na istoj strani, tako da će G biti uspješno
ugrađen.
Ako je s1 < w ali s2 w, tada je us1 u sukobu sa ww u H, ali us2 nije. Ako su
uu i ww u različitim komponentama lijevog grafa za H, tada možemo prebaciti
komponentu koja sadrži uu da stavimo uu i ww na istu stranu. Ako su u istoj
komponenti na suprotnim stranama, tada FH sadrži put P neparne dužine koji
povezuje uu sa ww. Ovaj put će se takođe pojaviti u G. Ali u G, us1 se sukobljava i
sa uu i sa ww, stvarajući neparan ciklus u FG, što je kontradikcija. Iz toga slijedi da
rezultat vrijedi kada je m > 1.
Po indukciji, teorema vrijedi za sve vrijednosti |L(T)| 1 i sve n.

Kada se utvrdi da je G ravan, mora se konstruisati planarno ugrađivanje. Ovo


se sastoji od dva dijela, 1) konstruiranja kombinatornog ugrađivanja i 2)
konstruiranja geometrijskog ugrađivanja G. Geometrijsko ugrađivanje je stvarni
raspored, koji predstavlja vrhove kao tačke u ravni, a ivice kao neukrštajuće krive
u avion. Kombinatorno ugrađivanje je dato cikličkim redoslijedom bridova u
svakom vrhu [18]. Readov algoritam [18] je jedna metoda koja se može koristiti za
konstruiranje geometrijskog ugrađivanja nakon što je dano kombinatorno
ugrađivanje. Nishizeki i Chiba [6,17], koristeći PQ stabla, daju metodu pronalaženja
kombinatornog ugrađivanja. Hopcroft-Tarjan algoritam kako je ovdje predstavljen
zapravo pruža geometrijsko ugrađivanje, gotovo besplatno.

28
Machine Translated by Google

6.6 Teorema. Ako je G planaran, povezane liste LF i RF u potpunosti određuju


kombinatorno ugrađivanje G.
Skica dokaza. Jasno je da obilazak T zajedno sa njegovim listovima određuje ciklički
red ivica na svakom vrhu u G.
Ako |L(T)| = 1, T je jedna putanja, a obilazak je određen redoslijedom listova na LF i
RF. Ako |L(T)| > 1, neka je v L(T) posljednji list koji je posjetio algoritam, neka je u
= b(v), w = L1(v) i koristi se indukcija.
Lažni list uw i marker grane uu će se pojaviti na suprotnim stranama T. Prelazak LF
i RF će naići na marker grane uu i odgovarajući lažni list uw, i „prošetati“ granu.
Prilično je jednostavno razviti algoritam koji će preći liste LF i RF i direktno dodijeliti
ciklički poredak ivica. Detalji će biti dati na drugom mjestu.

Ako je G neplanaran, sadrži homeomorf Kuratowskog podgrafa K3,3 ili K5. K5


se javlja samo u vrlo izuzetnim okolnostima (Kel mans[14]), tako da ako je G
neplanaran, obično želimo da pronađemo kućni omorf K3,3 u G. Ovim problemom
se bavi Williamson [19,21]. Nije previše teško vidjeti da su DF-stablo T zajedno sa
svojim tačkama grananja b(v) dovoljni da se pronađu putevi u G koji čine K3,3.
Algoritam za to ovdje nije predstavljen. Zasniva se na pronalaženju neparnog
ciklusa u F G.
U programiranju Hopcroft-Tarjan algoritma prvo se počinje sa LowPtDFS da bi
se odredili L1(v) i L2(v). Liste susjedstva se zatim sortiraju po težini. Zatim,
BranchPtDFS se može izvršiti kako bi se uspostavio prvi čvor u Adj[u]. Zatim se
izvršava EmbedBranch da bi se konstruisale liste LF i RF koje određuju kombinatorno
ugrađivanje G. Alternativa je kombinovanje BranchPtDFS i EmbedBranch u jedan
DFS, što je lako uraditi. U oba slučaja je očigledno da algoritam ima linearno vrijeme
rada, pošto DFS razmatra svaku ivicu G tačno dva puta.

Acknowledgement. Želio bih da se zahvalim Almiri Karabeg što mi je skrenula


pažnju na knjigu Williamsona [19].

Reference

1. AO Aho, JE Hopcroft i JD Ullman, Dizajn i analiza kompjuterskih algoritama,


Addison-Wesley, Reading, Massachusetts, 1974.

2. Giuseppe Di Battista, Peter Eades, Roberto Tamassia i Ioannis G.


Tollis, “Algoritmi za crtanje grafova: anotirana bibliografija”, preprint, 1993.

3. JA Bondy i USR Murty, Teorija grafova s primjenama, Amer


ican Elsevier Publishing, New York, 1976.

29
Machine Translated by Google

4. KS Booth i GS Lueker, “Testiranje svojstava uzastopnih, intervalnih grafova i


planarnosti grafa korištenjem algoritama PQ-stabla”, JCSS 13 (1976), 335-379.

5. Gary Chartrand i Ortrud Oellermann, Primijenjena i algoritamska teorija


grafova, McGraw-Hill, Inc., New York, 1993.
6. Norishige Chiba i Takao Nishizeki, “Linearni algoritam za ugradnju ding
planarnih grafova koristeći PQ-stabla”, Journal of Computer and System
Sciences 30 (1985), 54-76.
7. G. Demoucron, Y. Malgrange i R. Pertuiset, “Graphes planaires: reconnaissance
et construction des repr´esentations planaires topolo giques”, Rev. Francaise
Recherche Op´erationelle 8 (1965) 34-47.
8. Narsingh Deo, Teorija grafova s primjenama na inženjerstvo i računarstvo,
Prentice Hall, Inc., New Jersey, 1974.
9. Shimon Even, Graph Algorithms, Computer Science Press, Maryland,
1979.
10. LR Foulds, aplikacije teorije grafova, Springer-Verlag, New York,
1992.
11. Alan Gibbons, Algoritamska teorija grafova, Cambridge University Press,
Cambridge, UK, 1985.
12. Ronald Gould, Teorija grafova, Benjamin/Cummings Publishing, Inc., Menlo
Park, Kalifornija, 1988. 13. John Hopcroft i Robert Tarjan, “Efficient planarity
testing”, JACM 21 (1974), 449-568.

14. AK Kelmans, “Planarnost grafa i srodne teme”, Rutcor Research Report


#28-92, Univerzitet Rutgers, New Brunswick, New Jersey, 1992.
15. A. Lempel, S. Even i I. Cederbaum, “Algoritam za testiranje planarnosti
grafova”, u Teoriji grafova, Međunarodni simpozijum, Rim, 1966, Ed. P.
Rosenstiehl, Gordon i Breach, New York, 1967.
16. James A. McHugh, Algoritamska teorija grafova, Prentice Hall, Inc., New
Jersey, 1990.
17. T. Nishizeki i N. Chiba, Planarni grafovi: teorija i algoritmi, Annals of Discrete
Mathematics, vol. 32, Sjeverna Holandija, Amsterdam, 1988.

18. RC Read, “Nova metoda za crtanje planarnog grafa s obzirom na ciklički red
ivica u svakom vrhu”, Congressus Numerantium 56 (1987), 31-44.

19. S. Gill Williamson, Kombinatorika za kompjuterske nauke, Computer Science


Press, Maryland, 1985.
20. SG Williamson, “Ugrađivanje grafova u ravan – algoritamski kao aspekti”,
Annals of Discrete Mathematics 6 (1980), 349-384.
21. SGWilliamson, “Pretraga u dubinu i podgrafovi Kuratowskog”, JACM 31 (1984),
681-693.

30

Pogledajte statistiku publikacije

You might also like