CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
Jungusis grafas tai grafas, kuriame bet kuri virūnių pora sujungta grandine. Pavyzdiui, (r. 1 pav.) K5 ir C5 yra jungieji grafai, tačiau intuityviai jaučiame, kad K5 yra labiau jungus nei C5.
1 pav. Jungumas
Grafo jungumo klausimas yra aktualus praktikoje. Tarkime, reikia suprojektuoti kompiuterių tinkl¹. Tinkl¹ sudaro informacijos saugojimo ir apdorojimo centrai, kurie jungiami ryio kanalais. Informacijos pasikeitimas tarp dviejų centrų vyksta arba tiesiogiai per iuos centrus jungiantį ryio kanal¹ (jei toks yra), arba per kitus centrus ir juos jungiančius ryio kanalus. Aiku, kad tinklo grafas, kurio virūnės vaizduoja centrus, o dvi virūnės jungiamos briauna, jei tarp virūnėms atitinkančių centrų yra ryio kanalas, turi būti jungusis. Labai svarbus tinklo parametras yra jo patikimumas: tinklas turi funkcionuoti net ir tuo atveju, jei sugenda keli centrai arba ryio kanalai. į parametr¹ kiekybikai galima įvertinti per emiau įvestas s¹vokas.
Virūninio jungumo skaičius. Tai maiausias skaičius virūnių,
kurias paalinus, grafas G tampa arba
nejungiuoju grafu arba vienos virūnės grafu. is skaičius ymimas .
Briauninis jungumo skaičius. Tai maiausias skaičius briaunų, kurias
paalinus, grafas G tampa nejungiuoju
grafu. is skaičius ymimas .
Pavyzdiui, ,
.
2 pav. grafui (paalinus 4-¹j¹ virūnź, grafas suyra),
o
(paalinus briaunas (4, 6), (4, 7), (4, 8)
grafas suyra).
2 pav. Grafo jungumo kiekybiniai įverčiai
Grafo G virūnė v vadinama s¹lyčio taku, jei G v turi daugiau jungiųjų komponenčių nei grafas G.
Grafo G briauna vadinama tiltu, jei, j¹ paalimus, gautasis
grafas turi daugiau jungiųjų komponenčių nei grafas G.
Pavyzdiui, 3 pav grafas turi tris s¹lyčio takus (virūnės 4, 5, 6) ir vien¹ tilt¹ (briauna (4, 5)).
3 pav. Grafo s¹lyčio takai ir tiltai
Grįtant prie paragrafo pradioje pateikto pavyzdio, nesunku pastebėti, kad grafo virūninio jungumo ir briauninio jungumo skaičius parodo tinklo atsparum¹ centrų ir ryio kanalų gedimams, o s¹lyčio takai bei tiltai parodo labiausiai paeidiamas tinklo vietas.
Teorema. Kiekvienam grafui
čia ,
o
v-osios
virūnės laipsnis.
Teorema. Beveik kiekvienam grafui[6] teisinga lygybė
Grafas vadinamas k-jungiuoju,
jei ir briaunomis k-jungiuoju, jei
.
Jei ,
tai grafas vadinamas dviryiu
2 pav.
pavaizduotas grafas yra 1-jungusis ir briaunomis
3-jungusis. Ai ku, kad is grafas turi
pografius, kurie yra labiau jungieji nei pats grafas. Pavyzdiui, pografis,
kurį indukuoja virūnių aibė, yra 3-jungusis. Tokių
pografių apibūdinimui įvedama k-jungiosios komponentės s¹voka.
Grafo k-jungioji komponentė tai maksimalus k-jungusis pografis. Jis danai vadinamas k-komponente.
Pavyzdiui,
4 pav. grafas G1 turi dvi
2-jungi¹sias komponentes (pografiai, kuriuos indukuoja virūnių ir
aibės), o grafas G2 turi dvi 3-komponentes (pografiai, kuriuos indukuoja
virūnių
ir
aibės). Tačiau reikia pabrėti, kad
abu grafai G1 ir G2 yra 1-jungieji. Be to,
nesunku pastebėti, kad dvi 2-komponentės turi vien¹ bendr¹
virūnź (Grafe G1
tai 3-ioji virūnė), o dvi 3-komponentės turi dvi bendras
virūnes (grafe G2
tai 4-oji ir 6-oji virūnės).
Teorema. Dvi skirtingos grafo G k-komponentės
turi ne daugiau nei bendrų virūnių.
Apibrėimas. Dvi -grandinės
vadinamos nesusikertančiomis (virūnėmis nesusikertančiomis), jei jos
neturi bendrų virūnių, iskyrus a ir b.
Teorema (H.Witney, 1932). Grafas yra k-jungusis tada ir tiktai tada, kai bet
kuri nesutampančių virūnių pora sujungta ne maiau kaip k virūnėmis nesusikertančių grandinių.
Apibrėimas. Sakoma, kad grafo G virūnių poaibis S skiria virūnes a ir b,
jei grafe virūnės a ir b priklauso
skirtingoms jungiosioms komponentėms.
4 pav. Grafo k-komponentės
Teorema (K.Mengeras, 1927). Maiausias skaičius virūnų, skiriančių dvi negretimas virūnes a ir b, yra lygus didiausiam skaičiui poromis nesusikertančių grandinių, jungiančių a ir b virūnes.
Įveskime skiriančių briaunų s¹vok¹.
Apibrėimas. Briaunų aibė R skiria grafo G a ir b
virūnes, jei grafe virūnės a ir b priklauso
skirtingoms jungiamosioms komponentėms.
Teorema. Maiausias skaičius briaunų, skiriančių grafo G virūnes a ir b, yra lygus didiausiam briaunomis nesusikertančių grandinių, jungiančių a ir b virūnes, skaičiui.
Tiek grafų teorijoje, tiek ir praktikoje svarbi¹ viet¹ uima 2-jungieji grafai, kurie vadinami dviryiais grafais.
Kaip buvo minėta
aukčiau, grafas yra dviryis, jei bet kuri¹ nesutampančių
virūnių a ir b por¹ jungia bent dvi
virūnėmis nesusikertančios grandinės.
Galima pateikti ir kit¹
dviryio grafo apibrėim¹: grafas vadinamas dviryiu, jei jis neturi s¹lyčio
takų.
Apibrėimas. Didiausias galimas grafo G pografis, neturintis s¹lyčio takų, vadinamas dvigubo jungumo komponente arba bloku.
Grafo dvigubo jungumo komponenčių bei s¹lyčio takų iekojimo udavinys turi svarbi¹ reikmź. Pavyzdiui, visi komunaliniai ir transporto tinklai negali turėti s¹lyčio takų, t.y. maiausiai jie turi būti dviryiai.
Dvigubo jungumo komponenčių iskyrimas grafe padeda sprźsti nepriklausomų ciklų radimo udavinį bei nustatyti, ar grafas yra ploktusis.
Aptarsime grafo dvigubo jungumo komponenčių
(dviryių komponenčių, blokų) radimo udavinį.
S¹lyčio tako savybė. Neorientuotojo jungiojo grafo G virūnė a yra s¹lyčio taku tada ir tiktai tada, kada egzistuoja tokios kitos dvi grafo virūnės x ir y, kad bet kuris kelias tarp virūnių x ir y eina par virūnź a.
Pavyzdiui, 5 a) pav. Pavaizduotas grafas G, o 5 b) pav. to grafo dvigubo jungumo komponentės.
5 pav. Grafo dvigubo jungumo komponentės
i s¹lyčio tako savybė įgalina panaudoti paiekos gilyn metod¹, apskaičiuojant grafo G dvigubo jungumo komponentes blokus.
Panagrinėkime pavyzdį (r. 6 pav.).
6 pav. Grafo blokinė schema
6 pav. schematikai
vaizduoja jungųjį graf¹, susidedantį i 9-ių dvigubo
jungumo komponenčių bei turintį 5-is s¹lyčio takus v1, v2, v3, v4, ir v5.
Tarkime, kad paiek¹
gilyn pradėjome i 9-ojo bloko G9
virūnės s, ir visas
aplankytas virūnes (briaunas) talpiname į stek¹ STEK. Pradėjź
paiek¹ i virūnės s, per
virūnź v2 galime
patekti į blok¹ .
Remiantis paiekos gilyn savybe, kad per virūnź v2 grįime, kai bus aplankytos visos
virūnės, galime teigti, kad
sudaro virūnės (briaunos), kurios
buvo aplankytos tarp įėjimo ir grįimo per virūnź v2.
Su kitomis dvigubo jungumo komponentėmis reikalas sudėtingesnis. Ikeliavź i virūnės s, galime patekti į jungumo komponentź G3, o i G3 per virūnź v3 patekti į komponentź G2. Tačiau ir iuo atveju, kai aplankytos virūnės (briaunos) saugomos steke STEK, grįtant per virūnź v3, visos aplankytos bloko G2 virūnės bus steko viruje (nuo steko viraus iki virūnės v3). Paalinus i steko ias virūnes, steko viruje liks bloko G3 virūnės, kurios buvo aplankytos iki patekome į blok¹ G2. Kai grįime į virūnź v2, steko viruje bus visos bloko G3 virūnės.
Vadinasi, jei mokėtume atpainti s¹lyčio takus, tai naudodami paiek¹ gilyn ir saugodami aplankytas virūnes (briaunas) steke ta tvarka, kuria jos buvo aplankytos, galime rasti dvigubo jungumo komponentes: virūnės (briaunos), esančios steko viruje grįimo per s¹lyčio tak¹ metu, sudaro dvigubo jungumo komponentź.
Aptarkime formali¹ s¹lyčio takų radimo s¹lyg¹.
Tarkime, kad jungusis neorientuotasis grafas. Tarkime,
kad T jį dengiantis medis su
aknimi r, sukonstruotas paiekos
gilyn i virūnės r metodu.
1 lema. aknis r yra s¹lyčio takas tada ir tiktai tada, kai r turi daugiau nei vien¹ sūnų (r. 7 pav.).
7 pav. Dengiančio medio T aknis r s¹lyčio takas
2 lema. Virūnė yra grafo s¹lyčio takas tada ir tiktai tada,
kai yra nors vienas virūnės v
sūnus r, kuris neturi
atvirktinių briaunų, jungiančių jį patį arba bet
kurį jo palikuonį su virūnės v protėviu (r. 8 pav.).
Priminsime, kad grafo G atvirktinės briaunos yra visos briaunos, nepriklausančios dengiančiojo medio T briaunų aibei.
8 pav. Dengiančio medio T virūnė v s¹lyčio takas
S¹lyčio takams rasti
kiekvienai grafo virūnei v
įvesime du parametrus: ir
.
Parametras yra virūnės v aplankymo eilės numeris, atliekant paiek¹ gilyn i
virūnės r.
Parametras [7]
tai maiausias aplankymo numeris virūnės x, į kuri¹ galime patekti i virūnės v grandine, sudaryta i nulio arba
daugiau dengiančio medio briaunų ir nedaugiau kaip vienos
atvirktinės briaunos (r. 9 pav.).
9 a) pav. pavaizduotas
grafas G, o 9 b) pav. pavaizduotas t¹
graf¹ dengiantis medis, sukonstruotas paiekos gilyn i 1-osios
virūnės metodu. Medio briaunos pavaizduotos itisine, o
atvirktinės briaunos punktyrine linija. Romėnikais skaičiais
paymėti virūnių aplankymo eilės numeriai, o parametro reikmės apibrėtos.
9 pav. Parametrų nr[v] ir low[v] reikmės
Pasinaudodami
parametrais ir
galima 2 lemos kriterijų perrayti kaip
teorem¹.
Teorema. Virūnė yra grafo G
s¹lyčio takas tada ir tiktai tada, kai v
turi sūnų s, kuriam
.
Pavyzdiui, 9 a) pav.
grafui s¹lyčio takai yra: 1-oji virūnė (medio aknis, turinti du
sūnus), 6-oji virūnė (ji turi sūnų ,
kuriam
)
ir 8-oji virūnė (ji turi sūnų
,
kuriam
).
Bendresnis pavyzdys
pateiktas 10 paveiksle. Čia 10 a) pav. duotas grafas, o 10 b) jį
dengiantis medis, sukonstruotas naudojant paiek¹ gilyn i 1-osios
virūnės. Simbolių prie medio reikmės tos pačios, kaip ir
9 b) pav. Remiantis aukčiau pateiktu nagrinėjimu, nesunku apskaičiuoti,
kad io grafo s¹lyčio takai yra: 1-oji virūnė (aknis, turinti du
sūnus), 6-oji virūnė (sūnaus parametras
),
8-oji virūnė (turi du sūnus
ir
,
kurių
)
ir 11-oji virūnė (sūnaus
).
Parametr¹ galima apibrėti rekurentikai:
low[v] = min (nr[v]; low[s], čia s virūnės v sūnus; nr[w], čia (v, w) atvirktinė briauna).
10 pav. S¹lyčio takų apskaičiavimas
Remiantis iuo
apibrėimu, reikmė apskaičiuojama taip.
Kai virūnė v paiekos gilyn metu yra aplankoma pirm¹ kart¹, tai
Kai nagrinėjama
atvirktinė briauna ,
tai
.
Kai grįtame
į virūnź v, pilnai apėjus visas briaunas, incidentikas
sūnui s, tai .
Kai grįtame
į virūnź v, pilnai
apėjus visas briaunas, incidentikas sūnui s, tai reikmė nusistovi. Jei iuo metu
,
tai, pagal teorem¹, v yra s¹lyčio
takas.
emiau pateikta dvigubo jungumo komponenčių iekojimo procedūra, kurios pagrind¹ sudaro paiekos gilyn algoritmas, inagrinėtas 2.8.1.2 paragrafe, ir kuris papildytas aukčiau aptartu s¹lyčio takų s¹lygos tikrinimu bei blokų formavimu.
const c
type
mas = array [1..c] of integer;
matr = array [1..2, 1..c] of integer;
procedure blok (n, m : integer; L, lst : mas; var st : mas);
var i, k, u : integer;
s, sk, tau : integer;
t, p, pirma : boolean;
fst, prec : mas;
stek : mas;
nr, low : mas;
begin
pirma := false;
v
nr [v] := 1;
low [v] := 1;
sk
tau
for i := 1 to n do begin
fst [i]:= lst [i] + 1;
prec [i] := 0;
st [i] := 0;
end
k := v;
if fst [k] <= lst [k + 1] then
begin
t := false;
p := true;
prec [k] := k;
end
else
t := true;
while not t do
begin
while p do
begin
u := L [fst [k]];
if prec [u] = 0 then
begin
sk := sk +1;
nr [u] := sk;
low [u] := nr [u];
tau := tau + 1;
stek [tau] := k;
tau := tau + 1;
stek [tau] := u;
prec [u] := k;
if fs t [u] <= lst [u + 1] then
k := u
else
p := false;
end
else
begin
if (prec [k] <> u) and (nr [k] > nr[u]) then
begin
tau := tau + 1;
stek [tau] := k;
tau := tau + 1;
stek [tau] := u;
if nr [u] < low [k] then low [k] := nr [u];
end
p := false;
end
end
while not p and not t do
begin
fst [k] := fst [k] + 1;
if fst [k] <= lst [k + 1] then
begin
if k = 1 then
pirma := true;
p := true;
end
else
if prec [k] = k then
t := true
else
begin
s := k;
k := prec [k];
if low [s] < low [k] then low[k]:=low[s];
if ((k <> 1) and (low [s] >= nr [k])) or ((k = 1) and pirma) then
begin
st[k] := 1;
writeln ('s¹l. takas = ', k : 3);
end
if low [s] >= nr [k] then
begin
writeln ('blokas');
while (stek [tau] <> s) or (stek [tau 1] <> k) do
begin
write (stek [tau] : 3,' - ',
stek [tau 1] : 3);
tau := tau 2;
writeln
end
write (stek [tau] : 3,' ',
stek [tau 1] : 3);
tau := tau 2;
writeln
end
end
end
end
end;
Aptarsime kelis praktinių udavinių pavyzdius.
Pirmas pavyzdys. Tarkime, kad turime tinkl¹ automobilinių kelių, kuriais galima nuvykti i punkto A į punkt¹ B. Keliai gali kirstis tarpiniuose punktuose. Kiekvienai kelio atkarpai yra inomas maksimalus skaičius automobilių, kuriuos i kelio atkarpa gali praleisti per laiko vienet¹ (kelio pralaidumas). Koks didiausias skaičius automobilių per laiko vienet¹ gali nuvaiuoti i punkto A į punkt¹ B? is automobilių skaičius vadinamas nagrinėjamo kelio tinklo automobilių srauto dydiu. Paparastai mus domina ne vien tik koks didiausias automobilių skaičius gali nuvykti i A į B, bet ir kiekvieno kelio ruoo srautas, t.y. koks skaičius automobilių vyksta iuo kelio ruou.
Aiku, kad galimas ir kitas klausimas: kiek ir kokių kelių pralaidumus reikia padidinti, kad maksimalus automobilių srautas per į kelių tinkl¹ padidėtų nurodytu dydiu?
Antras pavyzdys. Tarkime, kad naftos verslovė A naftotiekių tinklu yra sujungta su perdirbimo įmone B. Taip pat inome kiekvieno naftotiekio tarpo maksimalų pralaidum¹ debit¹ (naftos kiekį per laiko vienet¹). Kokį kiekį naftos per laiko vienet¹ galime perpumpuoti iuo tinklu?
Trečias pavyzdys. Turime informacijos perdavimo tinkl¹. inomas kiekvienos ryio linijos pralaidumas. Kokį didiausi¹ informacijos kiekį iuo tinklu galima perduoti i punkto A į punkt¹ B?
ie ir daugelis kitų praktinių udavinių nagrinėjami srautų tinkluose teorijos metodais. iame paragrafe sprźsime pagrindinį ios teorijos udavinį maksimalaus srauto radimo udavinį.
Apibrėimas. Tinklas, tai pora ,
kur pirmasis poros elementas
yra bet koks orientuotasis grafas, kuriame
iskirtos dvi virūnės s ir
t, i kurių pirmoji
virūnė s, neturinti
įeinančių lankų, vadinama altiniu, o antroji t, neturinti ieinančių lankų,
vadinama nuotakiu. Antrasis poros elementas C yra funkcija
,
kuri kiekvienam lankui
priskiria neneigiam¹ realųjį
skaičių
,
kuris vadinamas lanko pralaidumu.
Apibrėimas. Tarkime, kad duota funkcija .
Tada funkcijos f divergencija
virūnėje v vadinamas dydis
,
apibrėiamas formule:
(1)
Jei interpretuosime kaip sraut¹ i
virūnės u į
virūnź v, tai skaičius
parodo srauto kiekį, kuris ieina i
virūnės v. is skaičius
gali būti teigiamas (jei i virūnės v daugiau ieina negu įeina, t.y. virūnė v yra papildomas altinis), neigiamas
(jei į virūnź v daugiau
įeina negu ieina, t.y. srautas kaupiasi virūnėje v) ir lygus nuliui.
Apibrėimas. Funkcija vadinama srautu tinkle S, jeigu:
kiekvienam grafo G lankui galioja nelygybė
(2)
kiekvienos virūnės v, iskyrus s ir t, divergencija lygi nuliui, t.y.
(3)
Skaičius vadinamas srauto dydiu.
Pagal į apibrėim¹ nagrinėjame sraut¹, kuris nesikaupia ir neatsiranda nei vienoje tarpinėje grafo G virūnėje (iskyrus virūnes s ir t).
Toliau sprźsime
maksimalaus srauto radimo udavinį: rasime
toki¹ funkcij¹ ,
kuri tenkintų (2) ir (3) apribojimus ir kuriai skaičius
būtų didiausias. Aiku, kad
funkcijos f reikmės
kiekvienam lankui
apibrė maksimalų sraut¹ per į
lank¹.
Maksimalaus srauto apskaičiavimo udavinys yra tiesinio programavimo udavinys, todėl jam gali būti taikomi tiesinio programavimo udavinių sprendimo metodai. Tačiau, įvertinant udavinio specifik¹, yra sukurti ymiai efektyvesni io udavinio sprendimi metodai, kuriuos toliau ir nagrinėsime.
Pjūvio apibrėimas. Tinklo S
pjūviu ,
kurį apibrėia grafo G
virūnių tikrinis poaibis A,
t.y.
ir
ir
,
vadiname grafo G tokių
lankų
aibź, kad
,
o
.
Kitaip tariant,
Aiku, kad bet kokiam
tinklo S srautui f pjūvio srautas yra lygus pjūvį sudarančių
lankų sumai, t.y.
Lema. Jei ,
o
,
tai bet kokiam srautui f i s
į t galioja lygybė
(4)
Įrodymas. (4) lygybės teisingumas iplaukia i (1) ir (3) formulių.
Susumuokime (3) lygtis
visoms grafo virūnėms .
i¹ sum¹ sudarys nariai
,
turintys pliuso arba minuso enkl¹.
Jei abi
virūnės u ir v priklauso aibei A, tai turės pliuso enkl¹ lygtyje
ir minuso enkl¹ lygtyje
,
ir io dėmens neturės nei viena lygtis
,
kai
ir
.
Vadinasi, sumuodami iuos dėmenis, gausime 0.
Jei ,
o
,
tai kiekvienas narys
sumoje pasikartos vienintelį kart¹ su
enklu plius lygtyje
,
ir visumoje gausime
.
Analogiki dėmenys
,
kai
,
o
,
duos (4) formulės narį
.
Kita vertus, nagrinėjama suma lygi
,
nes
visiems
.
Ivada. .
Imdami i (4) formulės gausime:
Gauta tapatybė įrodo intuityviai aikų fakt¹: nuotakio srautas yra lygus altinio srautui.
Įrodyta lema sako tai, kad tinklo srautas gali būti matuojamas bet kuriame pjūvyje, kuris atskiria s ir t virūnes.
Pavyzdys. 1 pav. pavaizduotas tinklas. Skaičiai prie
lankų apibrėia sraut¹ f. Lankų pralaidum¹ ymi
skliausteliuose parayti skaičiai. Panagrinėkime pjūvius, kuriuos
nusako virūnių ir
poaibiai.
1 pav. Srautas tinkle: 1-osios lemos ir didinančiosios grandinės iliustracija. Punktyru iskirta didinančioji grandinė.
Aibės A virūnių divergencija yra:
ias lygtis sudėjź, gausime:
Sutraukź panaius narius, gausime:
Įstatź srauto reikmes, gausime:
Pjūviui, kurį
nusako poaibis ,
analogikai gausime:
Įstatź srauto reikmes, gausime:
Nesunku pastebėti, kad ie pavyzdiai iliustruoja lemos įrodym¹ bei lemos ivados teisingum¹.
Apibrėimas. Pjūvio, kurį nusako
virūnių poaibis A, t.y.
pjūvio pralaidumas yra skaičius,
apibrėiamas formule
Kitaip tariant,
pjūvio pralaidumas yra lygus pjūvį
sudarančių lankų pralaidumų sumai.
Apibrėimas. Minimaliu pjūviu vadinsime
pjūvį ,
kurio pralaidumas yra maiausias tarp visų
galimų pjūvių, atskiriančių s ir t virūnes.
Vienas i pagrindinių srautų tinkluose rezultatų yra nusakomas Fordo ir Falkersono teorema.
Teorema (Fordas (Ford L.R.) ir Falkersonas (Fulkerson D.R.) 1962). Bet kokio srauto i virūnės s į virūnź t dydis nevirija minimalaus pjūvio, skiriančio ias virūnes, pralaidumo; be to egzistuoja toks srautas, kurio dydis yra lygus tokio minimalaus pjūvio pralaidumui.
Įrodymas. Tarkime, kad minimalus pjūvis. Remiantis lema, bet
kokiam srautui f gausime:
Įrodymas, kad maksimalaus srauto dydis yra lygus minimalaus pjūvio pralaidumui, yra sudėtingesnis faktas. is įrodymas iplauks i maksimalaus srauto konstravimo algoritmo, kuris nagrinėjamas kitame paragrafe.
Visi inomi maksimalaus srauto konstravimo algoritmai pagrįsti nuosekliu srauto didinimo metodu, o visų srauto didinimo metodų pagrind¹ sudaro didinančiųjų grandinių teorija.
Apibrėimas. Tinklo S lankas e i virūnės u į virūnź v vadinamas leistinuoju lanku srauto f atvilgiu, jeigu
a) ir
arba
b) ir
.
Jei galioja s¹lyga a), tai tokį lank¹ vadinsime suderintuoju (soglasovannaja duga). Jei galioja s¹lyga b), tai tokį lank¹ vadinsime nesuderintuoju (nesoglasovannaja duga).
Apibrėimas. Ilgio l didinančioji grandinė i virūnės s į virūnź t srauto f atvilgiu yra seka, sudaryta i besikeičiančia tvarka suraytų (poromis skirtingų) virūnių ir lankų:
(5)
Čia ,
ir kiekvienam
lankas
srauto f
atvilgiu yra leistinasis lankas i virūnės
į virūnź
.
Pavyzdiui, 1 pav. pavaizduoto tinklo ir srauto per jį atvilgiu, grandinė:
(6)
yra didinančioji grandinė, kurios ilgis yra 6.
inodami (5) pavidalo didinanči¹j¹ grandinź, sraut¹ f galime padidinti dydiu
čia
Tam tikslui (pavyzdiui, iūrint į 1 pav.) reikia didinančiosios grandinės kiekvieno suderintojo lanko sraut¹ padidinti dydiu d, o kiekvieno nesuderintojo lanko sraut¹ sumainti tuo pačiu dydiu d, t.y.
Aiku, kad taip
apskaičiuota funkcija yra srautas, nes
,
;
ir
,
.
I tikro, jei nepriklauso didinančiajai grandinei, tai
.
Tarkime, kad
priklauso didinančiajai grandinei. Tada (r. 2 pav.):
jei ir
yra suderintieji lankai, tai srautas,
įtekantis į virūnź
ir itekantis i jos padidėja tuo pačiu
dydiu d ; tuo būdu
(r. 2 a) pav.),
jei ir
yra nesuderintieji lankai, tai srautas,
įtekantis ir itekantis i virūnės
sumaėja tuo pačiu dydiu d ; vadinasi
(r. 2 b) pav.),
jei yra suderintasis lankas, o
nesuderintasis lankas, tai srautas
įeinančiu į virūnź
lanku
padidėja dydiu d, o įeinančiu lanku
sumaėja tuo pačiu dydiu; vadinasi
(r. 2 c) pav.),
jei yra nesuderintasis lankas, o
suderintasis lankas, tai ieinančiu i
virūnės
lanku
srautas sumaėja dydiu d, o ieinančiu i virūnės lanku
padidėja tuo pačiu dydiu; tuo būdu
(r. 2 d) pav.).
2 pav. Didinančiosios grandinės lankų, incidentikų virūnei vi, srauto perskaičiavimas
Srauto dydis padidėja dėmeniu d
Pavyzdys. Panagrinėkime tinkl¹ su srautu f, kuris pavaizduotas 1 pav. (6) seka yra io tinklo ir srauto per jį atvilgiu didinančioji grandinė. iai grandinei
Vadinasi, 2. 17.1 pav. pavaizduoto tinklo sraut¹ galima padidinti dydiu 1, t.y. nuo 10 iki 11. 3.17.3 pav. pavaizduotas tas pats 1 pav. tinklas ir perskaičiuotas srautas.
3 pav. Tinklo, pavaizduoto 1 pav., srautas po modifikacijos
Įrodysime teorem¹, kuri pagrindia maksimalaus srauto apskaičiavimo, naudojant didinačiasias grandines, metod¹.
Teorema. emiau pateiktos trys s¹lygos yra ekvivalenčios:
srautas i s į t maksimalus,
neegzistuoja didinančios grandinės srauto f atvilgiu,
egzistuoja
pjūvis, kurį nusako toks virūnių poaibis ,
skiriantis virūnes s ir t (
,
),
kad
.
Įrodymas Þ 2). Jei srautas maksimalus, tai aiku, kad neegzistuoja didinančiosios grandinės io srauto atvilgiu, nes, prieingu atveju, esant didinančiai grandinei, sraut¹ būtų galima padidinti.
Þ 3). Tarkime, kad srautui f neegzistuoja didinančiosios grandinės. Apibrėkime
virūnių aibź ,
kuri¹ sudaro virūnės tokios grandinės
kad ,
,
ir
leistinasis lankas i virūnės
į virūnź
,
.
Aiku, kad
,
o
,
nes iuo atveju egzistuotų didinančioji grandinė srauto f atvilgiu. Panagrinėkime
pjūvį
.
I aibės A ir suderintojo lanko
apibrėimo iplaukia, kad kiekvienam pjūvio lankui turi galioti
lygybė
.
Vadinasi,
.
Analogikai, remiantis
aibės A ir nesuderintojo lanko
apibrėimu, gausime, kad .
Remiantis aukčiau įrodyta lema, gausime
Þ 1) iplaukia i to fakto, kad srauto dydis
neviija .
Pavyzdys. Nesunku patikrinti, kad srautas 3 pav. yra
maksimalus. Prisotintas pjūvis ,
atsirandantis teoremos įrodyme, yra
.
Remiantis pateiktais
teoriniais samprotavimais, galima sudaryti paprast¹ maksimalaus srauto
apskaičiavimo algoritm¹: pradėdami nuo bet kokio, pavyzdiui, nulinio
srauto (,
),
iekosime didinančiosios grandinės ir, jei tokia grandinė egzistuoja,
sraut¹ didinsime; prieingu atveju srautas f
yra maksimalus.
Tačiau čia ikyla klausimas, ar algoritmo ingsnių skaičius yra baigtinis. Fordas ir Falkersonas[8] davė neigiam¹ atsakym¹. 1962 m. jie pateikė pavyzdį tokio tinklo, kuriame galima taip parinkinėti didinančiasias grandines, kad procesas niekada nepasibaigtų. Be to, srauto dydis vis¹ laik¹ bus ketvirtadaliu maesnis u maksimalaus srauto dydį.
Tačiau 1972 m.
Edmondsas (Edmonds J.) ir Karpas (Karp R.M.)[9]
įrodė, kad, jei kiekviename ingsnyje sraut¹ didinsime trumpiausios
didinančiosios grandinės atvilgiu, tai maksimalus srautas bus
sukonstruotas, panaudojant ne daugiau kaip grandinių (čia
,
).
Rasti trumpiausi¹ didinanči¹j¹ grandinź patogu, naudojant paiek¹ platyn (r.
2.9 paragraf¹). Įvertinant tai, kad trumpiausios grandinės
konstravimo algoritmo sudėtingumas yra
,
galime įvertinti viso maksimalaus srauto apskaičiavimo algoritmo
sudėtingum¹,
.
Čia nenagrinėsime
io algoritmo detalių, kadangi toliau panagrinėsime efektyvesnį
1970 m. Dinico (Dinic E.A.)[10]
pasiūlyt¹ maksimalaus srauto apskaičiavimo algoritm¹, kurio
sudėtingumas yra .
Dinico metodas susideda
i fazių. Jo efektyvumas pagrįstas tuo, kad, nepriklausomai nuo
tinklo lankų pralaidumo, fazių skaičius niekada nevirija ,
čia n tinklo virūnių
skaičius [Lip88].
Panagrinėkime k-osios fazės veiksmus. Tarkime, kad fazės pradioje turime
tinkl¹ G ir jame apibrėt¹
sraut¹ f. Tokį tinkl¹
ymėsime simboliu Gf.
Remdamiesi tinklu Gf, sudarome pagalbinį
tinkl¹, kuris neturi kontūrų (ciklų) ir kurio struktūra
vaizduoja visas trumpiausias didinančiasias tinklo Gf grandines. Paymėkime į tinkl¹ simboliu Sf. Tinklas Sf konstruojamas paiekos
platyn grafe Gf metodu, ir
į tinkl¹ Sf
įtraukiami tinklo Gf
srauto f atvilgiu leistinieji
lankai. Tuo būdu į tinkl¹ Sf
įeina altinis s, nuotakis t ir grafo Gf leistinieji lankai ,
čia virūnė u nutolusi nuo
altinio s atstumu d, o virūnė v atstumu d+1,
,
o l yra tinklo Sf ilgis, t.y. atstumas
nuo s iki t grafe Gf.
io lanko pralaidum¹ ymėsime
ir apibrėime formule
Sudarius pagalbinį tinkl¹ Sf, toliau jame apskaičiuojamas pseudomaksimalus srautas.
Apibrėimas. Ilgio l tinklo Sf pseudomaksimalus srautas tai toks tinklo Sf srautas f *, prie kurio tinkle Sf neegzistuoja nei viena l ilgio didinančioji grandinė; kitaip tariant, bet kokiam tinklo Sf i virūnės s į virūnź t keliui
egzistuoja toks lankas , kad
Po to pseudomaksimalus
srautas perkeliamas į pagrindinį tinkl¹ Gf : srautas sumuojamas su Gf srautu
;
jei i suma iaukia lanko
persipildym¹, t.y. suma virija
,
tai is srauto perteklius kompensuojamas sumainant sraut¹
.
Tuo būdu virūnės u
divergencija
padidėja dydiu
,
o virūnės v divergencija
tuo pačiu dydiu sumaėja. Nesunku
įsitikinti, kad tokių visų lankų srautų modifikacija
apibrėia nauj¹ tinklo Gf
sraut¹
,
kurio dydis
.
iuo veiksmu ir baigiama k-oji fazė.
Maksimalaus srauto konstravimas baigiamas, kai i tinklo Gf nebegalima sukonstruoti pagalbinio tinklo Sf.
Kaip bus matyti i
toliau pateiktų tinklo Sf
bei jo pseudomaksimalaus srauto apskaičiavimo algoritmų, vienos fazės
sudėtingumas yra .
Kadangi, kaip parodyta literatūroje [Lip88], fazių skaičius nevirija
,
tai Dinico metodo sudėtingumas yra O(n3).
Pavyzdys. Panagrinėkime tinkl¹, pavaizduot¹ 4 a) paveiksle. Prie lanko paraytas skaičius reikia lanko maksimalų sraut¹, o skaičius skliausteliuose rodo lanko pralaidum¹.
4 pav. Maksimalaus srauto iekojimas Dinico metodu
Pradėjź nuo tinklo
nulinio srauto ,
pirmiausia apskaičiuojame pagalbinį be kontūrų tinkl¹ Sf0 (r. 4 b)
pav.). Po to rast¹jį pseudomaksimalų sraut¹ perkeliame į tinkl¹
,
gaudami sraut¹
,
t.y. tinkl¹ Gf1.
Toliau konstruojame
pagalbinį tinkl¹ Sf1
(r. 4 c) pav.), ir rast¹jį pseudomaksimalų sraut¹ perkeliame į
tinkl¹ Gf1.
Gauname sraut¹ (tinkl¹ Gf2).
Paskutinėje
fazėje konstruojame pagalbinį tinkl¹ Sf2 (r. 4 d) pav.). Kai io tinklo
pseudomaksimalų sraut¹ perkeliame į Gf2, gauname sraut¹ f, pavaizduot¹ 4 a) pav., kuris yra maksimalus tinklo G srautas, kadangi (r. 1 paragrafo Fordo ir Falkersono teorem¹).
4 c) pav. gerai iliustruoja t¹ fakt¹, kad pseudomaksomalus srautas nebūtinai yra maksimalus srautas. I tikro, iame paveikslėlyje pavaizduot¹ pseaudomaksimalų sraut¹ galime padidinti panaudojź ilgio 5 didinanči¹j¹ grandinź:
Taip pat
paymėsime, kad tinklo Sf2
(r. 4 d) pav.) lankas atsirado i pagrindinio tinklo G dviejų prieprieais
nukreiptų lankų.
Aptarkime pagalbinio
tinklo ir jo pseudomaksimalaus srauto apskaičiavimo
algoritmus.
Tarkime, kad pradinio
tinklo grafas nusakytas gretimumo struktūromis ir
,
.
tai
aibė virūnių, į kurias i virūnės v ieina lankai.
tai
aibė virūnių, i kurių į virūnź v įeina lankai.
Lankų pralaidum¹
ymėsime masyvu ,
,
o faktin¹jį sraut¹ f masyvu
,
.
Tokia pralaidumo bei srauto vaizdavimo struktūra atminties poiūriu
nėra racionali, tačiau prie ios struktūros algoritmas tampa
vaizdesnis.
Kintamieji,
vaizduojantys pagalbinį tinkl¹ ,
yra analogiki pradinio tinklo kintamiesiems ir jie ymimi tais pačiais
vardais, pridedant prie jų pradinź raidź S. Tuo būdu, SV ymi
tinklo
virūnių aibź;
ir
,
,
ymi
gretimumo struktūr¹; Sc ir Sf atitinkamai ymi
lankų pralaidumus ir sraut¹. Masyvo d elementas
,
,
ymi tinklo
virūnės v nuotolį nuo altinio s.
Kaip buvo minėta
aukčiau, tinklas konstruojamas paiekos platyn i
virūnės s tinkle
metodu. Paiekos platyn procese aplankytos
virūnės v talpinamos
į eilź. Kiekviena i eilės paimta virūnė u nagrinėjama du kartus: pirm¹
kart¹ iekomi i jos ieinantys leistinieji suderintieji lankai
;
antr¹ kart¹ iekomi leistinieji nesuderintieji lankai
.
Jei tinkle vienu metu lankas
yra suderintasis ir nesuderintasis leistinasis
lankas, t.y.
leistinasis suderintasis lankas, o
leistinasis nesuderintasis lankas, tai
į tinkl¹
įtraukto lanko
pralaidumas yra lygus ių lankų
pralaidumų srauto f atvilgiu
sumai.
procedure psa
begin
for u I V do
begin
d [u] := ¥
SN [u] :=Æ; SPN [u] := Æ
for v I V do Sc [u, v] := 0;
for v I V do Sf [u, v] := 0;
end
Eil Æ; SV := Æ; d [s] := 0;
Eilė s
while Eil ¹ Æ do
begin
u Eilė
SV := SV È
for v I N [u] do
if ( d [u] < d [v] £ d [t] ) and (f [u, v] < c [u, v] ) then
begin
if d [v] = ¥ then Eil v
d [v] := d [u] + 1;
SN [u] := SN [u] È
SPN [v] := SPN [v] È
Sc [u, v] := c [u, v] f [u, v];
end
for v I PN [u] do
if ( d [u] < d [v] £ d [t] ) and (f [v, u] > 0 ) then
begin
if d [v] = ¥ then Eil v
d [v] := d [u] + 1;
if Sc [u, v] = 0 then
begin
SN [u] := SN [u] È
SPN [v] := SPN [v] È
end
Sc [u, v] := Sc [u, v] + f [v, u];
end
end
end
Tarkime, po
procedūros psa įvykdymo .
Jei
,
tai reikia, kad paiekos platyn metu nuotakio virūnė t nebuvo pasiekta. Vadinasi, tinkle
nuo s
iki t nėra didinančiosios
grandinės. Tada, remiantis 2 paragrafo teorema, galime teigti, kad srautas
f yra maksimalus.
Jei ,
tai trumpiausios didinančiosios grandinės i s į t ilgis yra l. Be to, visų kelių nuo s iki t ilgiai tinkle
yra lygūs l, ir jie ymi l ilgio
didinančiasias grandines tinkle
.
Reikia paymėti, kad, pasiekus nuotakį t,
tampa lygus
,
ir virūnės v, kurioms
,
procedūroje psa
nenagrinėjamos, kadangi nei viena tokia virūnė negali
priklausyti l ilgio keliui,
jungiančiam s ir t.
Nesunku įvertinti
procedūros psa sudėtingum¹.
Kiekviena virūnė v į
eilź talpinama ir alinama ne daugiau kaip vien¹ kart¹. Kiekvienas
virūnei v incidentikas lankas
analizuojamas vien¹ kart¹, be to, analizės veiksmų skaičius apribotas
konstanta. Vadinasi, bendras veiksmų skaičius be inicializacijos yra .
Inicializacijos veiksmų skaičius yra
.
Tuo būdu, procedūros psa
sudėtingumas yra
.
Belieka aptarti tinklo pseudomaksimalaus srauto efektyvaus
apskaičiavimo algoritm¹. emiau pateiktas Malchotros, Kumaro ir Mahevario
(Malhotra V.M., Kumar P.M., Makeshvari S.N. An
algorithm for finding maximum flows in networks. Information
Processing Lett. 1978, 7, s. 277 278) pseudomaksimalaus srauto apskaičiavimo algoritm¹, kurio
sudėtingumas yra
.
io algoritmo apraymui įveskime tinklo virūnės potencialo s¹vok¹.
Apibrėimas. Tinklo virūnės v potencialas yra maksimalus srauto
kiekis, kurį galima praleisti per virūnź v. Virūnės v
potencialas apibrėiamas formule
emiau pateikta maxpsa
procedūra pirmiausia apskaičiuoja pagalbinio tinklo visų virūnių potencialus ir
nulinio potencialo virūnes patalpina į stek¹ STEK. Aiku, kad
nulinio potencialo virūnes drauge su joms incidentikais lankais galima
paalinti i tinklo
,
ir is paalinimas neturės įtakos jokiam tinklo
srautui. Tokių virūnių, o
tikslaiu joms incidentikų lankų paalinimas gali paveikti kitų
tinklo
virūnių potencialus, ir jie gali
tapti lygūs nuliui. Jei taip atsitinka, tai naujos nulinio potencialo
virūnės alinamos i tinklo.
Jei, pasibaigus nulinio
potencialo virūnių alinimo procesui, tinklas neturi nenulinio potencialo
virūnių, tai tinklo
pseudomaksimalus
srautas surastas. Prieingu atveju randame maiausio potencialo virūnź r ir jos potencial¹ p. Tada i virūnės r
į virūnź t ir i
virūnės s į
virūnź r konstruojame p dydio sraut¹. Tuo būdu
apskaičiuojamas p dydio srautas i
altinio s į nuotakį t. is srautas naudos tik leistinuosius
suderintuosius lankus.
Aptarsime, kaip konstruojamas p dydio srautas i virūnės r į virūnź t. Srauto i virūnės s į virūnź r konstravimas yra analogikas.
Kaip buvo minėta, p dydio srautas i virūnės r į virūnź t naudos tik suderintuosius
leistinuosius lankus, ir jį patogiausia konstruoti naudojant paiek¹
platyn i virūnės r.
Įsivaizduokime, kad virūnėje r patalpintas krovinys ,
ir mes norime perkelti į krovinį į virūnź t. Kiekviena paiekos platyn metu
aplankyta virūnė v
perkelia krovinį
į virūnes u, į kurias eina lankai i virūnės v. Be to, į virūnź u perkeliamo krovinio dalis yra lygi
lanko
pralaidumui, t.y.
.
Aiku, kad tokie lankai gali būti alinami i tinklo. Lankų alinimas
iaukia virūnių potencialų perskaičiavim¹, ir, jei
virūnės v potencialas
tampa lygus nuliui, tai virūnė v
talpinama į stek¹ STEK.
Tuo būdu, krovinys
i virūnės r, kuri nuo altinio s nutolusi atstumu d, pirmiausia bus perkeltas į virūnes, nutolusias nuo
altinio s atstumu
,
po to, i ių virūnių, į virūnes, nutolusias nuo
altinio s atstumu
ir t.t. iki visas krovinys bus perkeltas
į virūnź t. Kadangi p yra maiausias virūnės
potencialas, tai toks krovinio perkėlimas visada yra galimas.
Kaip minėjome, srautas i s į r konstruojamas analogikai.
p
dydio srauto i virūnės s
į t konstravimu baigiasi
pagrindinio ciklo veiksmai, ir, kaip buvo minėta aukčiau, pagrindinis
ciklas bus kartojamas, kol tinklas turės nenulinio potencialo
virūnių.
procedure maxpsa
begin
STEK Æ
for v I SV do
begin
Pin [v] := 0; Pout [v] := 0;
if v = s then Pin [v] := ¥
else
for uI SPN [v] do
Pin [v] := Pin [v] +Sc [u, v];
if v = t then Pout [v] := ¥
else
for uI SN [v] do
Pout [v] := Pout [v] + Sc [v, u];
P [v] := min (Pin [v], Pout [v]);
if P [v] = 0 then STEK v
end
for v I SV do Q [v] := 0;
XN := SV;
while XN ¹ Æ do
begin
while STEK ¹ Æ do
begin
v STEK; XN := XN
for u I SPN [v] do
begin
Pout [u] := Pout [u] (Sc [u, v] Sf [u, v]);
SN [u] := SN [u] ;
SPN [v] := SPN [v] ;
if P [u] ¹ 0 then
begin
P [u] := min (Pin [u], Pout [u]);
if P [u] = 0 then STEK u
end
end
for u I SN [v] do
begin
Pin [u] := Pin [u] (Sc [v, u] Sf [v, u]);
SPN [u] := SPN [u] ;
SN [v] := SN [v] ;
if P [u] ¹ 0 then
begin
P [u] := min (Pin [u], Pout [u]);
if P [u] = 0 then STEK u
end
end
end
if XN ¹ Æ then
begin
p ¥
for v I XN do
if P [v] < p then
begin
r :=v;
p := P [r];
end
Eilė Æ Eilė r; Q [r] := p;
repeat
v Eilė
Pin [v] := Pin [v] Q [v];
Pout [v] := Pout [v] Q [v];
P [v] := P [v] Q [v];
if P [v] = 0 then STEK v
if v = t then Q [v] := p
else
begin
u := pirmoji aibės SN [v] virūnė
while Q [v] > 0 do
begin
if Q [u] = 0 then Eilė u
delta := min (Q [v], Sc [v, u] Sf [v, u]);
Sf [v, u] := Sf [v, u] + delta;
Q [v] := Q [v] delta;
Q [u] := Q [u] + delta;
if Sf [v, u] = Sc [v, u] then
begin
SN [v] := SN [v] ;
SPN [u] := SPN [u] ;
end
if Q [v] > 0 then
u := po virūnės u einanti kita aibės SN [v] virūnė
end
end
until v = t;
Eilė Æ Eilė r; Q [r] := p;
repeat
v Eilė
if v ¹ r then
begin
Pin [v] := Pin [v] Q [v];
Pout [v] := Pout [v] Q [v];
P [v] := P [v] Q [v];
if P [v] = 0 then STEK v
end
if v = s then Q [v] := 0
else
begin
u := pirmoji aibės SPN [v] virūnė
while Q [v] > 0 do
begin
if Q [u] = 0 then Eilė u
delta := min (Q [v], Sc [u, v] Sf [u, v]);
Sf [u, v] := Sf [u, v] + delta;
Q [v] := Q [v] delta;
Q [u] := Q [u] + delta;
if Sf [u, v] = Sc [u, v] then
begin
SPN [v] := SPN [v] ;
SN [u] := SN [u] ;
end
if Q [v] > 0 then
u := po virūnės u einanti kita aibės
SPN [v] virūnė
end
end
until v = s;
end
end
end
Aptarkime
procedūros maxpsa sudėtingum¹.
Pradinis virūnių potencialų apskaičiavimas reikalauja veiksmų, kadangi kiekvienas grafo lankas
analizuojamas ne daugiau kaip du kartus: apskaičiuojant Pout [v] ir Pin [v].
Pagrindinio ciklo
nulinio potencialo virūnių alinimo sudėtingumas taip pat yra ,
kadangi kiekviena virūnė į stek¹ STEK talpinama vien¹ kart¹, o
alinant virūnź i steko paalinamos visos jai incidentikos briaunos,
tuo būdu kiekvienas lankas alinamas ne daugiau kaip vien¹ kart¹.
Kiekviena pagrindinio ciklo iteracija iaukia ne maiau kaip vienos nulinio potencialo virūnės atsiradim¹ (virūnės r potencialas visada bus lygus nuliui). Vadinasi, pagrindinio ciklo pasikartojimų skaičius nevirija n.
Pagrindiniame cikle, be minėtų nulinio potencialo virūnių alinimo veiksmų, naudojant paiek¹ platyn konstruojamas p dydio srautas i r į t ir i s į r. ių dalių sudėtingumas yra lygus lankų analizavimo skaičiaus eilei.
Lanko analizė gali būti naikinamoji, kai srautas per lank¹ yra lygus to lanko pralaidumui, ir toks lankas alinamas i tinklo.
Lanko analizė gali būti nenaikinamoji, kai srauto per lank¹ dydis yra maesnis u to lanko pralaidum¹. Toks lankas i tinklo nealinamas ir gali būti analizuojamas kartojant pagrindinį cikl¹.
Aiku, kad per visus
pagrindinio ciklo pasikartojimus naikinamuoju būdu analizuojame lankų, o kiekviename pagrindiniame cikle
nenaikinamuoju būdu analizuojame ne daugiau kaip n lankų (po vien¹ kiekvienai aplankytai virūnei).
Vadinasi, per visus pagrindinio ciklo pasikartojimus nenaikinamuoju būdu
bus analizuota ne daugiau kaip n2
lankų. Tuo būdu, bendras pagrindinio ciklo veiksmų skaičius yra
,
t.y.
.
I viso
nagrinėjimo darome ivad¹, kad procedūros maxpsa sudėtingumas yra .
Dabar apraytas psa ir maxpsa procedūras galima sukomponuoti į vien¹ bendr¹ maksimalaus srauto apskaičiavimo algoritm¹.
Duota: tinklas,
nusakytas gretimumo struktūromis ir
,
;
laukų pralaidumu
,
;
altiniu s ir nuotakiu t.
Rezultatas: maksimalus srautas ,
.
for u I V do
for v I V do f [u, v] :=0; .
repeat
psa
if d [t] ¹ ¥ then
begin
maxpsa
for u I SV do
for v I SV do
begin
f [u, v] := f [u, v] + Sf [u, v];
if f [u, v] > c [u, v] then
begin
f [v, u] := f [v, u] (f [u, v] c [u, v]);
f [u, v] := c [u, v];
end
end
end
Ivada. I procedūrų psa ir maxpsa sudėtingumo analizės bei to, kad fazių
skaičius nevirija iplaukia, kad pateikto maksimalaus srauto
algoritmo sudėtingumas yra
.
Tuo pačiu ių algoritmų analizė parodė, kad bet kokiam
tinklui egzistuoja maksimaus srautas. O tai ir yra Fordo ir Falkersono teoremos
pilno įrodymo trūkstama grandis.
į paragraf¹ baigsime akivaizdia, bet svarbia pateikta maksimalaus srauto radimo algoritmo savybe.
Teorema. Jeigu tinklo visų lankų
pralaidumai yra sveikieji skaičiai, tai maksimalus srautas, apskaičiuotas pagal
pateikt¹ algoritm¹, yra sveikaskaitinis, t.y. yra sveikasis skaičius kiekvienam tinklo
lankui
.
Apibrėimas. Suporavimas neorientuotajame grafe tai toks grafo G briaunų poaibis
,
kad bet kokios dvi poaibio M briaunos
tarpusavyje nėra gretimos, t.y. bet kokios dvi poaibio M briaunos nėra incidentikos
vienai ir tai pačiai virūnei.
Jei briauna ,
tai sakome, kad M suporuoja
u ir v virūnes.
Jei virūnė v nėra incidentika nei vienai poaibio M briaunai, tai virūnė v vadinama laisv¹ja virūne, prieingu atveju suporuot¹ja.
Maksimalaus suporavimo neorientuotame grafe udavinys yra plačiai paplitźs, ir yra inomi efektyvūs io udavinio sprendimo algoritmai. Visi jie pagrįsti alternuojančių grandinių teorija (teorija čeredujučichsia cepei).
Tarkim, M grafo G suporavimas.
Apibrėimas. Grafo G grandinė, kuri¹ sudaro biaunos, pakaitomis nepriklausančios ir priklausančios poaibiui M, vadinama suporavimo M atvilgiu alternuojančia grandine.
Grandinė, kurios ilgis lygus 1, pagal apibrėim¹ taip pat yra alternuojanti.
Alternuojančios grandinės briaunos, priklausančios suporavimui M, vadinamos tamsiomis briaunomis, o nepriklausančios M viesiomis briaunomis.
Pavyzdys. Panagrinėkime 5 pav. pavaizduot¹ graf¹.
5 pav. Suporavimo udavinys
Aibė yra suporavimas grafe G; grandinė
yra suporavimo M atvilgiu alternuojanti grandinė;
,
tamsiosios grandinės P briaunos;
,
,
viesiosios grandinės P briaunos; aibės
ir
atitinkamai suporuotųjų ir
laisvųjų virūnių aibės.
Aiku, kag jei grafe G suporavimo M atvilgiu egzistuoja grandinė, jungianti dvi laisv¹sias virūnes, tai grafe G galima sukonstruoti suporavim¹, turintį didesnį briaunų skaičių nei M. Aiku, kad tokios alternuojančios grandinės viesiųjų briaunų skaičius yra vienetu didesnis nei tamsiųjų. Paalinź i M visas tamsiasias grandinės briaunas, ir į M įvedź visas viesiasias tos grandinės briaunas, gausime suporavim¹, kuriame briaunų skaičius bus vienetu didesnis nei M. Dėl tos prieasties alternuojanti grandinė, jungianti dvi laisvasias virūnes, vadinama didinančiaja grandine.
Teorema (K.Beras). Neorientuotojo grafo G suporavimas M yra didiausias tada ir tiktai tada, kai iame grafe suporavimo M atvilgiu nėra didinančiosios grandinės.
iai teoremai
iliustruoti panagrinėkime aukčiau 5 pav. pateikt¹ graf¹. Imkime
suporavim¹ ir didinanči¹j¹ grandinź
.
Dabar galima sudaryti didesnį suporavim¹
.
Suporavimas taip pat nėra didiausias, nes io
suporavimo atvilgiu egzistuoja grandinė
.
Gausime suporavim¹ ,
kuris yra didiausias, nes jo atvilgiu grafe nėra didinančiosios
grandinės.
Tuo būdu, Bero teorema nusako toki¹ didiausio suporavimo radimo strategij¹.
Randame bet kokį pradinį suporavim¹ M.
Pavyzdiui, pradinis suporavimas gali būti būti kuri grafo briauna.
Didesnio pradinio suporavimo galima iekoti, naudojant godaus algoritmo strategij¹:
a) rasti briaun¹, kurios incidentikų virūnių laipsnių suma yra maiausia, ir įtraukti i¹ briaun¹ į suporavim¹;
b) i grafo paalinti į suporavim¹ įtraukt¹ briaun¹ drauge su jai gretimomis briaunomis.
Aiku, kad punktai a) ir b) bus kartojami tol, kol grafas G turės bent vien¹ briaun¹.
Nuosekliai konstruoti suporavimų sek¹ ,
kurioje
gaunamas i
radus grafe G suporavimo
atvilgiu didinanči¹j¹ grandinź. Kadangi
,
tai sekos ilgis bus nedidesnis nei
.
Todėl norint rasti efektyvų io udavinio sprendimo algoritm¹,
pagrįst¹ inagrinėta strategija, reikia sukonstruoti efektyvų
didinančiosios grandinės radimo algoritm¹. Nors tokie efektyvūs
algoritmai egzistuoja, čia apsiribosime didiausio suporavimo dvidaliame grafe
nagrinėjimu.
Daniausiai suporavimo udavinys sprendiamas dvidaliuose grafuose (r. 2.2, 2.10 paragrafus). Tai klasikinis kombinatorikos udavinys, inomas udavinio apie sutuoktinių poras vardu.
Primename, kad -grafas
yra dvidalis, jei jo virūnių aibź V galima iskaidyti į du poaibius X ir Y
taip, kad visų grafo G
briaunų galai priklausytų skirtingiems poaibiams. Todėl dvidalis
grafas ymimas
.
Udavinys apie
sutuoktinių poras turi toki¹ interpretacij¹. Tarkime, X ir Y
atitinkamai yra vaikinų ir merginų aibės. Sudarykime
dvidalį graf¹ ,
čia
,
jei jaunuolis x draugauja su mergaite
y. Tada kiekvienas suporavimas M atitinka aibź galimų
sutuoktinių porų, kiekviena i kurių sudaryta i tarpusavyje
draugaujančių jaunuolio ir merginos; be to, kiekvienas mogus dalyvauja ne
daugiau kaip vienoje poroje.
Pasirodo, kad maksimalaus suporavimo udavinį dvidaliame grafe galima lengvai suvesti į maksimalaus srauto tinkle iekojimo udavinį.
Tarkime, dvidalis grafas. Sudarykime tinkl¹
,
kuris turėtų altinį s,
nuotakį t (
ir
),
virūnių aibź
,
lankų aibź
ir kiekvieno lanko pralaidumas
.
Pavyzdys. 6 a) pav.
pavaizduotas dvidalis grafas H, o 6
b) pav. jam atitinkantis tinklas .
6 pav. Dvidalis grafas H
ir jam atitinkantis tinklas S(H). Suporavimas
M = ir jam atitinkantis
srautas fM.
Teorema. Kiekvienam grafo H k galios suporavimui ,
(
,
visiems
)
egzistuoja vienintelis tinklo
dydio k
sveikaskaitinis
srautas
apibrėiamas taip:
visiems
,
visiems
likusiems tinklo lankams e;
ir atvirkčiai, kiekvienam tinklo dydio k
srautui f
atitinka vienintelis grafo H
suporavimas
, apibrėiamas taip:
6 pav. pavaizduotas suporavimas
grafe H
ir jam atitinkantis srautas
tinkle
.
i teorema įgalina maksimalaus srauto apskaičiavimo algoritmus, inagrinėtus 6 paragrafe, panaudoti apskaičiuojant maksimalų suporavim¹ dvidaliame grafe.
Naudodami Dinico
metod¹, maksimalų suporavim¹ galima apskaičiuoti atlikus veiksmų. Tačiau, atsivelgiant į
tinklo
specifik¹, yra sukurti efektyvesni maksimalaus
suporavimo apskaičiavimo algoritmai. Čia panagrinėsime Hopkrofto ir Karpo
algoritm¹, kurio sudėtingumas yra
(r. Hopcroft J., Karp R.M. An
algorithm for maximum Matchings in bipartite
graphs. SIAM J. Comput., 1973, 2, s. 225-231).
is algoritmas naudoja
bendr¹ Dinico metodo schem¹. Vienok, dėl tinklo specifikos galima sumainti tiek fazių
skaičių, tiek ir sukurti efektyvesnį pseudomaksimalaus srauto
kiekvienoje fazėje apskaičiavimo algoritm¹.
Pirmiausia
paymėsime, kad tinklo kiekvienos didinančiosios grandinės ilgis
yra nelyginis skaičius, ir, i jos atmetus pirm¹j¹ ir paskutini¹j¹ grandis, i
grandinė bus alternuojanti, prasidedanti ir pasibaigianti viesiaja
briauna (leistinaisiais suderintaisiais lankais).
Apibrėimas. Duotajam suporavimui M ilgio ,
i X į Y
grandinź
:
kurioje visos virūnės yra skirtingos, x0 laisvoji X
aibės virūnė, o yk+1
laisvoji Y aibės
virūnė, o kiekviena antroji briauna priklauso M, t.y.
vadinsime alternuojančia grafo H grandine.
Aiku, kad
alternuojanči¹ grandinź galima nusakyti virūnių seka. i seka vieninteliu būdu
apibrėia srauto
atvilgiu didinanči¹j¹ grandinź:
Be to, ios
grandinės iauktas srauto padidėjimas nusako suporavim¹, gaut¹
susumavus aibes A ir P moduliu 2:
.
Pavyzdiui, 7 a) pav.
pavaizduotas dvidalis grafas ir suporavimas M; 7 b) pav. pavaizduota
didinančioji alternuojančioji grandinėP, o 7 c) pav. pavaizduotas
suporavimas .
7 pav. Suporavimo M padidinimas, panaudojant alternuojanči¹ grandinź P
Aiku, kad ir dvidalio grafo H atveju yra teisinga Bero teorema: grafo H suporavimas M yra didiausias tada ir tiktai tada, kai iame grafe suporavimo M atvilgiu nėra didinančiosios grandinės.
Apraysime Hopkrofto ir
Karpo algoritm¹. io algoritmo schema yra analogika Dinico algoritmo schemai:
kiekvienoje fazėje tinklui apskaičiuosime pagalbinį
bekontūrinį tinkl¹, jo pseudomaksimalų sraut¹ ir jį
perkelsime į pagrindinį tinkl¹. Kaip buvo minėta aukčiau,
dėl tinklo
specifikos ie algoritmai yra efektyvesni nei
Dinico metode naudojamas analogikas algoritmas, o fazių skaičius
maesnis.
Pirmiausia aptarsime pagalbinio bekontūrinio tinklo apskaičiavimo algoritm¹ PGA.
Tarkime, yra dvidalis grafas, o M suporavimas iame grafe. Graf¹ H pakeiskime orientuotuoju grafu
tokiu būdu: kiekvienai suporavimo M briaunai
suteikime orientacij¹ nuo Y į X, o visoms
likusioms briaunoms orientacij¹ nuo X
į Y. Aiku, kad tada kelias nuo
laisvosios virūnės
į laisv¹j¹ virūnź
bus srauto M
atvilgiu didinančioji grandinė.
Procedūra PGA
pradioje konstruoja bekontūrinio tinklo lankus nuo virūnės s į visas laisv¹sias aibės X virūnes. Po to i ių
laisvųjų virūnių grafe organizuojama paieka platyn. Jei paiekos
platyn metu pasiekiame laisv¹j¹ virūnź
,
tai į bekontūrinį tinkl¹ įtraukiame lank¹
.
Be to, nuo to momento, kai į tinkl¹ įtraukiamas pirmasis toks lankas,
daugiau nenagrinėjamos virūnės, kurios nutolź nuo
virūnės s nemaiau kaip
kelio nuo s iki t ilgis.
Panagrinėkime
pseudomaksimalų sraut¹ procedūros PGA sukonstruotame
pagalbiniame tinkle. iame pagalbiniame ilgio tinkle l ilgio (atmetame 1-¹jį ir paskutinįjį lankus)
alternuojančios didinančiosios grandinės visų virūnių
potencialai yra lygūs 1. Pagal i¹ grandinź padidinus sraut¹, visos
grandinės virūnės eliminuojamos i tolesnio nagrinėjimo.
Vadinasi, pagalbinio tinklo pseudomaksimalų sraut¹ apibrė didiausia
aibė ilgio l poromis
nesusikertančių alternuojančių grandinių. Tokių
grandinių iekojim¹ realizuoja procedūra fazė, kuri naudoja
paiekos gilyn i virūnės s
pagalbiniame tinkle metod¹. Naujos aplankytos virūnės talpinamos
į stek¹ STEK. Kiekvien¹ kart¹, kai pasiekiama virūnė t, steke esančios virūnės
apibrėia alternuojanči¹ didinanči¹j¹ grandinź. Tada visos
virūnės, iskyrus virūnź s,
alinamos i steko kartu didinant sraut¹ (suporavim¹), kurį nusako masyvas
pora. emiau pateikti
procedūrų PGA, fazė ir pagrindinės programos
tekstai.
Duota: Dvidalis grafas , nusakytas gretimumo
struktūra
, čia
aibė virūnių, gretimų
virūnei x.
Rasti: Didiausi¹ suporavim¹, kurį nusako
masyvas pora [1..n], ,
kurios elementas
begin
for u I V È do
begin
d [u] = ¥
SN [u] := Æ
end
Eilė Æ; SV := Æ
SV := SV È
d [s] := 0;
for x I X do
if pora [x] = 0 then
begin
Eilė x
SN [s] := SN [s] È
d [x] := 1;
end
while Eilė ¹ Æ do
begin
u Eilė
SV := SV È
if u I Y then
if pora [u] = 0 then
begin
SN [u] := SN [u] È t
if d [t] = ¥ then
begin
SV := SV È
d [t] := d [u] + 1;
end
end
else
begin
x := pora [u];
if d [t] = ¥ then
begin
Eilė x
SN [u] := SN [u] È
d [x] := d [u] + 1;
end
end
else
for y I N [u] do
if d [u] < d [y] then
begin
if d [y] = ¥ then Eilė y
SN [u] := SN [u] È
d [y] := d [u] + 1;
end
end
end
procedure faz
begin
for u I SV do
begin
naujas [u] := true;
p [u] := pradia [u];
end
STEK Æ; STEK s; naujas [s] := false;
while STEK ¹ Æ do
begin
u := top (STEK);
if p [u] = nil then b := false
else b := not naujas [p [u] .virūnė
while b do
begin
p [u] := p [u] pėdsakas
if p [u] = nil then b := false
else b := not naujas [p [u] .virūnė
end
if p [u] ¹ nil then
if p [u] .virūnė = t then
while top (STEK) ¹ s do
begin
y STEK
x STEK
pora [x] := y; pora [y] := x;
end
else
begin
v := p [u] .virūnė
STEK v
naujas [v] := false;
end
else
u STEK
end
end
begin
for v I V do pora [v] := 0;
PGA
while t I SV do
begin
fazė
PGA
end
end
Reikia paymėti,
kad didelis Hopkrofto ir Karpo algoritmo efektyvumas gaunamas todėl, kad
fazių skaičius yra nedidesnis nei [Lip88].
Primename s¹vok¹ beveik kiekvienam grafui. Simboliu paymėkime
skaičių n-virūninių
grafų, turinčių savybź P, o
simboliu
visų n-virūninių grafų
skaičų. Tada sakysime, kad beveik visi grafai turi savybź P, jei
, o jei
, tai sakome, kad beveik nėra grafų, turinčių
savybź P.
Parametr¹ galima apibrėti
ir kitais odiais: parametras
tai maiausias
aplankymo numeris virūnės x,
į kuri¹ galime patekti i virūnės v arba bet kurio jos palikuonio ne daugiau kaip vienos
atvirktinės briaunos pagalba.
Ford L.R., Fulkerson D.R. Flows in networks. Princeton Univ. Press, Princeton, N.J. 1962. Yra vertimas į rusų kalb¹. Ford L.R., Falkerson D.R. Potoki v setiach., Moskva: Mir, 1966.
Edmonds J., Karp R.M. Theoretical improvements in algorithmic efficiency for network flow problems. J.ACM, 1972, 19, p.p. 248-264.
Dinic E.A. Algoritm reenija zadači o maksimalnom potoke v seti so stepennoj ocenkoj. Dokl. Akademii nauk SSSR, serija Mat. Fiz., 1970, 194, 4, s. 754-757.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2089
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2025 . All rights reserved