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: 2065
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved