Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  


AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Probleme de drum in (di)grafuri

calculatoare

+ Font mai mare | - Font mai mic



DOCUMENTE SIMILARE

Trimite pe Messenger
Limbaje de programare specifice Web-ului
Administrarea indecsilor Oracle9I
Avantajele sistemului informatic
ASPECTE ALE CALCULULUI NUMERIC IN VIRGULA MOBILA (II)
COMPRESIA AUDIO
CONCEPEREA SI REALIZAREA UNUI SISTEM INFORMATIC (eventual FINANCIAR BANCAR)
Gestiunea unui Hipermarket
Componentele guvernarii electronice
Guvernarea electronica si economia digitala
CODIFICAREA DATELOR


Probleme de drum in (di)grafuri

Parcurgeri sistematice ale (di)grafurilor.




Dat G = (V, E) un (di)graf cu multimea varfurilor V = si s I V, se cere sa se genereze “eficient” multimea S a varfurilor accesibile din s pe drumuri in G.

Solutia pe care o vom da va impune un proces de “vizitare” succesiva a vecinilor lui s in G, apoi a vecinilor (inca nevizitati) ai acestora, s.a.m.d., pana se va construi multimea S.

Algoritmul va implementa o metoda sistematica de “vizitare”, utila in probleme de optimizare pe grafuri, dar mai ales in problemele in care grafurile sunt folosite ca structuri (explicite sau implicite) de date.

Vom presupune ca (di)graful G este dat prin intermediul listelor de adiacenta (in cazul grafurilor se poate considera ca fiecare muchie genereaza o pereche de arce simetrice si reprezentarea folosita la sortarea topologica ramane valabila). In algoritm vom folosi doua multimi:

S = multimea varfurilor (deja) vizitate;

S astfel incat v I S - vw I E Þ w I S (complementara in S a lui contine varfuri ai caror vecini au fost deja vizitati).

Algoritmul se va termina atunci cand = Æ.

Initial, S = = . In pasul curent al algoritmului, se alege un varf din si se va “explora”, considerand “urmatorul” vecin din lista sa de adiacenta (inca neexaminat). Daca lista sa de adiacenta a fost parcursa, atunci se poate “scoate” acest varf din . Daca exista acel urmator vecin si n-a fost inca vizitat, el se adauga la S si la . “Pozitia” urmatorului vecin neexaminat din lista de adiacenta a unui varf i se va gestiona cu ajutorul unui pointer p[i], care initial are valoarea cap[i] si va fi avansat in timpul parcurgerii listei vecinilor lui i.

Descriem aceasta “vizitare” a varfurilor (di)grafului in procedura nerecursiva exploraredin(s).

type pointer = ^arc;

arc = record

varf : 1 . . n;

prec : pointer;

end;

var cap, p : array[1 . . n] of pointer;

procedure exploraredin (s : 1 . . n);

begin

S := S È ;

:= ;

while ¹ Ø do

begin

alege v I

if p[v] = nil then

sterge v din

else

begin

w := p[v]^.varf;

p[v] := p[v]^.prec;

if w Ï S then

begin

adauga w la S;

adauga w la ;

end;

end;

end;

end;

Presupunand ca operatiile subliniate necesita timpul de O(1), atunci se observa ca aplicarea lui exploraredin(s) va necesita timpul O(ns + es) unde, ns = || si es = numarul arcelor (muchiilor) cu ambele extremitati in multimea finala S. Acest ordin de complexitate rezulta din faptul ca la fiecare iteratie a ciclului while, in timp constant, sau se adauga un nou varf la S (), sau se progreseaza in lista de adiacente a unui varf din .

Pentru ca operatiile subliniate sa se execute in O(1) va trebui ca S sa fie reprezentata cu ajutorul unui tablou boolean [S : array[1 . . n] of boolean; initializarea lui S (pe fals) inaintea apelului lui exploraredin, necesita O(n) operatii; testul if w Ï S este if not S(w), deci O(1); atribuirea S := S È este S(s) := true; (adauga w la S) este S(w) := true] iar ca o lista inlantuita:

Daca va fi o stiva cu top : pointer capul ei, atunci:

:= s new(top); top^.varf := s; top^.prec := nil.

¹ Ø top ¹ nil.

alege v I v := top^.varf (nu se modifica top)

sterge v din top := top^.prec

adauga w la new(l); l^.varf := w; l^.prec := top; top := l.

In acest caz , de fiecare data, va fi ales pentru explorare ultimul varf introdus in si parcurgerea se face “mai intai in adancime”, depth first search (dfs).

Daca va fi o coada cu cap, spate : pointer inceputul si sfarsitul ei, atunci:

:= s; new(l); l^.varf := s; l^.prec := nil; cap := l; spate := l;

¹ Ø cap ¹ nil;

alege v I v := cap^.varf (nu se modifica nici cap nici spate).

sterge v din cap := cap^.prec; (if cap = nil then spate := nil)

adauga w la new(l); l^.varf := w; spate^.prec := l; spate := l; (l^.prec := nil)

In acest caz, de fiecare data, va fi ales spre explorare cel mai “vechi” varf introdus in si un varf va fi scos din abia dupa ce i se introduc toti vecinii neexplorati inca. Parcurgerea va fi deci “mai intai la latime” breadth first search (bfs).

Implementarea lui ca o stiva (deci dfs) se poate face explicit, asa cum am aratat mai sus, dar si implicit scriind o forma recursiva a lui exploraredin(s). Vom face acest lucru in aplicatia urmatoare, in care vom lista componentele conexe ale unui graf reprezentat cu ajutorul listelor de adiacenta in O(n + e), n = | V |, e = | E |.

var cap, p : array[1 . . n] of pointer;

i, nrcconexa : integer;

l, topc : pointer;

procedure dfs(v : 1 . . n);

var p1 : pointer;

w : 1 . . n;

begin

p1 := p[v];

while p1 ¹ nil do

begin

w := p1^.varf;

p1 := p1^.prec;

if not S[w] then

begin

new(l);

l^.varf := w;

l^.prec := topc;

topc := l;

S[w] := true;

dfs(w)

end;

end;

end;

begin

for i := 1 to n do S[i] := false;

for i := 1 to n do p[i] := cap[i];

nrcconexa := 0;

for i := 1 to n do

if not S[i] then

begin

nrcconexa := nrcconexa + 1;

S[i] := true;

new(topc);

topc^.varf := i;

topc^.prec := nil;

dfs(i);

writeln(‘componenta conexa ‘, nrcconexa);

while topc ¹ nil do

begin

write(topc^.varf);

topc := topc^.prec;

end;

end;

end.

Vom face in continuare, o analiza a comportarii logice a parcurgerii dfs a unui (di)graf, pentru a pune in evidenta modul de accesare a varfurilor, precum si o partitie a multimii muchiilor (arcelor), relevante in aplicatii (care necesita parcurgerea sistematica a (di)grafului in scopul calcularii recursive a unor functii definite pe multimea varfurilor sale, in ordinul O(n + m)).

In aceleasi ipoteze referitoare la tipurile de date si variabilele folosite mai sus, consideram modulul apelant:

begin

for v := 1 to n do

begin

p[v] := cap[v];

S[v] := false;

end;

nr1 := 0;

nr2 := 0;

for v := 1 to n do

if not S[v] then

begin

nr1 := nr1 + 1;

viz[v] := nr1;

S[v] := true;

dfs(v);

nr2 := nr2 + 1;

sfv[v] := nr2

end;

end.

si procedura dfs:

procedure dfs(v : V);

var p1 : pointer;

w : V;

begin

p1 := p[v];

while p1 ¹ nil do

begin

w := p1^.varf;

p1 := p1^.prec;

if not S[w] then

begin

;}

nr1 := nr1 + 1;

viz[w] := nr1;

S[w] := true;

dfs(w);

nr2 := nr2 + 1;

sfv[v] := nr2

end

else

begin

if viz[w] > viz[v] then }

else

if drum de la w la v in (V, T) then

}

else }

end

end;

end;

S-au utilizat nr1 si nr2 pentru construirea tablourilor viz si sfv, avand semnificatia:

viz[v] = numarul de ordine al intalnirii varfului v de catre procedura dfs (apelul dfs(v) este cel de-al viz[v]-lea, in traversare (di)grafului);

svf[v] = numarul de ordine al sfarsitului vizitarii varfului v de catre procedura dfs.

De asemenea, s-au construit submultimile T, B, F, C ale lui E (in operatiile subliniate) care au urmatoarele semnificatii, in ipoteza ca G este digraf:

T – multimea arcelor utilizate de procedura dfs pentru parcurgerea digrafului; se verifica imediat ca (V, T) este o reuniune de arborescente (arborescentele dfs).

F – multimea arcelor “forward”, orientate de la o extremitate initiala vizitata inaintea extremitatii finale;

B – multimea arcelor “backward”, orientate de la o extremitate initiala vizitata dupa extremitatea finala si extremitatea initiala se afla in subarborescenta dfs cu radacina in extremitatea finala; mai precis, vw I B Û vw I E, viz[v] > viz[w] si sfv[v] < sfv[w].

C – multimea arcelor “cruce”, orientate de la o extremitate initiala, aflata intr-o arborescenta dfs construita dupa cea in care se afla extremitatea finala; mai precis, vw I C Û vw I E, viz[v] < viz[w] si sfv[v] > sfv[w].

Se observa ca B, F, sau C pot fi vide si ca E = T È B È F È C si toate aceste multimi sunt disjuncte. Daca G este graf, atunci B = F si C = Æ, interpretarile fiind evidente.

Vom exemplifica utilitatea parcurgerii sistematice a unui digraf, pentru a depista eficient componentele sale tari-conexe (modificari minore ale metodei pe care o vom descrie permit determinarea blocurilor (componentelor biconexe) ale unui graf).

Fie G = (V, E) un digraf. Consideram, pe multimea varfurilor sale, relatia binara: vrw Û exista drum de la v la w si drum de la w la v in digraful G. Se verifica imediat ca r este relatie de echivalenta. Clasele de echivalenta in raport cu relatia r se numesc componentele tari-conexe ale digrafului G (submultimi maximale (in raport cu incluziunea) de varfuri cu proprietatea ca induc subdigrafuri tari-conexe). In digraful desenat mai jos componentele tari conexe sunt: , , , .

Idea algoritmului este urmatoarea:

se efectueaza o parcurgere dfs a digrafului, construind tablourile viz si sfv.

Daca C este o componenta tare conexa a lui G, definim

.

Fie C0 astfel incat f(C0) = minC f(C), deci C0 este prima componenta tare conexa pentru care se termina complet vizitarea.

Daca f(C0) = sfv[v0], atunci, notand cu subarborescenta dfs cu radacina in v0, avem C0 = V(). In adevar, C0 V(), intrucat in avem varfurile accesibile prin drumuri in G (si orice varf al lui C0 are aceasta proprietate). Daca V() – C0 ¹ Æ, se contrazice alegerea lui C0, intrucat x I V() – C0 satisface sfv[x] < sfv[v0] (x este vizitat de un apel recursiv generat de dfs(v0)).

Rezulta ca la terminarea vizitarii varfului v0 s-a depistat C0.

Recunoasterea varfului v0 este simpla: v0 este primul varf al digrafului cu proprietatea ca din nici unul din descendentii sai dfs nu exista arce de intoarcere (B) cu extremitatea finala w avand viz[w] < viz[v0].

Pentru G – C0 se repeta acelasi rationament.

Daca vom considera b[v] = cel mai mic viz[w] al unui arc uw I B cu u I Tv, daca exista un astfel de arc, altfel b[v] = viz[v], atunci se observa ca intreg planul de lucru descris mai sus se realizeaza la o singura traversare a digrafului , intrucat b[v] se pot calcula recursiv, iar considerarea subdigrafului G - C0 inseamna simpla continuare a traversarii.

Detaliile sunt descrise mai jos ( modulul apelant si procedura dfs adaptata problemei):

begin

for v:=1 to n do

begin

p[v] = cap[v];

S[v] := false

end;

nr:=0;

L:= Æ;

for v:=1 to n do

if not S[v] then

begin

nr := nr+1;

viz[v] := nr;

S[v] :=true;

adauga v la L;

dfs(v);

end

end.

procedure dfs(v : V);

var p1 : pointer; w : V;

begin

p1 :=p[v];

b[v] := viz[v];

while p1 ¹ nil do

begin

w := p1 .virf;

p1 := p1 .prec;

if not S[w] then

begin

nr := nr +1;

viz[w]:= nr;

S[w] := true;

adauga w la L;

dfs(w);

if b[w]<b[v] then

b[v]:= b[w]

end

else

if w I L and b[v] > viz[w] then

b[v] :=viz[w]

end;

if b[v] = viz[v] then

extrage din L c.t.c. cu radacina v formata din varfurile w din L cu viz[w] ³ viz[v].

end.

Pentru realizarea eficienta a operatiilor subliniate, se va implementa L ca o pereche formata dintr-un tablou boolean (pentru testarea apartenentei in O(1)) si ca o lista dublu inlantuita (pentru extragerea eficienta a varfurilor unei componente tare conexe; notam ca la insertia in L, elementele vin in ordinea crescatoare a lui viz, iar extragerea se face de la celalalt capat). Se verifica imediat ca in acest fel intreg algoritmul are complexitatea O(|V| + |E|).

Probleme de drum minim.

Fie G = (V, E) un digraf cu multimea varfurilor V = . Consideram data o functie a : E R cu interpretarea : ij I E a(ij) = costul arcului ij (ponderea, lungimea, etc.). Daca digraful G este reprezentat cu ajutorul listelor de adiacenta, atunci costul arcului ij este un camp in articolul ce reprezinta acest arc in lista de adiacenta a lui i. Pentru comoditatea notatiilor vom folosi reprezentarea digrafului G cu ajutorul matricii de cost-adiacenta A = (aij)n n cu



Notam ca ¥ desemneaza un numar real mare in raport cu celelalte costuri (de exemplu ¥ > n maxij I E a(ij)) si vom presupune in plus ca ¥ a = ¥, ¥ + ¥ = ¥.

(Este posibil, de asemenea , ca ¥ sa semnifice acces terminat cu insucces in structura de date in care se reprezinta matricea A).

Daca i, j IV, vom nota cu Dij = . Pentru Dij I D ij

Dij : (i =)v0 ,v0v1, v1, …, vr-1, vr-1vr, vr(= j )

multimea varfurilor este V(Dij) =

si multimea arcelor E(Dij) = .

Orice varf k ¹ i, j al lui Dij, determina pe Dij doua drumuri Dik I Dik si Dkj I Dkj. Vom nota Dij = Dik o Dkj.

Costul unui drum Dij I D ij se defineste

In particular, a(Dii) = 0. Principalele probleme de drum (de cost) minim care apar in aplicatii practice (sau sunt utile in rezolvarea altor probleme de optimizare combinatorie) sunt:

(P1) Date: G digraf, a : E(G) R, s, t I V(G) s ¹ t.

Sa se determine D*st I Dst astfel incat

a(D*st) = min

(P2) Date: G digraf, a : E(G) R, s I V(G).

Sa se determine D*si I Dsi i I V(G), astfel incat

a(D*st) = min i I V(G)

(P3) Date: G digraf, a : E(G) R.

Sa se determine D*ij I Dij i, j IV(G), astfel incat

a(D*ij) = min.

Observatii: 1. Cu conventia folosita in reprezentarea matricilor de cost adiacenta, se poate considera ca Dij ¹ Æ i, j I V. Daca a(Dij) < ¥ atunci Dij, este drum in G de la i la j iar daca a(Dij) = ¥, atunci Dij este drum in digraful complet simetric obtinut din G prin adaugarea arcelor lipsa, cu ponderea ¥. Rezulta ca toate multimile, pe care se considera minimele in problemele precedente, sunt nevide si, cum digrafurile considerate sunt finite, rezulta ca aceste multimi sunt finite (in fiecare drum varfurile sunt distincte), deci minimele considerate exista.

2. Algoritmii de rezolvare a problemei (P1) se obtin din algoritmii de rezolvare a problemei (P2) adauganduli-se un test suplimentar (evident) de oprire. Problema (P3) se poate rezolva iterand un algoritm de rezolvare a problemei (P2). Sunt posibile insa solutii mai eficiente.

Ne vom ocupa in continuare de rezolvarea problemei (P2).

Teorema 1. Fie G = (V, E) digraf, V = , s I V si a : E R, astfel incat

(I) C circuit in G, a(C) > 0.

Atunci (u1, …, un) este o solutia sistemului

(*)

daca si numai daca i I V, D*si I Dsi astfel incat a(D*si) = ui si a(D*si) = min.

Demonstratie : “ ” Fie D*si (i I V) solutii ale problemei (P2) cu a(D*si) = min. Notam cu ui = a(D*si) (i I V).

Sa observam ca ipoteza (I) asigura faptul ca us = 0; Pentru i ¹ s drumul D*si are un penultim varf j. Daca Dsj este drumul de la s la j determinat pe D*si de varful j, avem: ui = a(D*si) = a(Dsj) + aji ³ a(D*sj) + aji = uj + aji.

Presupunem ca ui > uj + aji, adica a(Dsj) > a(D*sj).

Avem 2 cazuri posibile :

i Ï V(D*sj). Atunci D1 =D*sj (j, ji, i) I Dsi si a(D1) = a(D*sj) + aji < a(Dsj) + aji = a(D*si), ceea ce contrazice alegerea drumului D*si .

i I V(Dsj*). Fie Dsi* = (Dsj) (Dij) cele doua drumuri determinate pe Dsj* de varful i. Atunci circuitul C = (Dij) (j, ji, i) are costul a(C) = a(Dij) + aji = a(Dsj*) – a(Dsj) + aji = uj + aji – a(Dsj) £ uj + aji – a(Dsj*) = uj + aji – ui < 0, contrazicand ipoteza (I)

Rezulta ca presupunerea ca ui nu satisface (*) este falsa si suficienta teoremei este demonstrata.

Notam ca de fapt am dovedit mai sus ca a(Dsj) = a(D sj) adica, daca j este varful dinaintea lui i pe un drum de cost minim de la s la i atunci si portiunea de drum de la s la j este de cost minim de la s la j. Inductiv rezulta ca: (Principiul optimalitatii al lui Bellman) daca D*si este drum de cost minim de la s la i atunci j I V(D*si) daca D*si = Dsj Dji atunci Dsj (respectiv Dji) sunt drumuri de cost minim de la s la j (respectiv de la j la i).

'Þ'. Dovedim ca daca (u1, …, un) este o solutie a lui (*) atunci:

a)      Dsi I Dsi : ui = a(Dsi) i I V

b)      Pentru orice i I V, ui =min (=a(D*si))

a)            Daca i = s atunci us = 0 si drumul Dss satisface a(Dss) = 0 = us. Daca i ¹ s, consideram urmatorul algoritm :

begin

v:=i;

k:=0;

while v ¹ s do

begin

determina w astfel incat uv = uw + awv ;

ik:=v;

k:=k+1;

v:=w;

end;

ik+1:=s

end.

Sa observam ca algoritmul determina drumul :

D : (s =) ik+1, ik+1ik, . . ., i1, i1i0, i0 (= i)

cu D I Dsi satisfacand a(D) = a(ik+1ik) + … + a(i1i0) = = ui – us = ui.

Nu este posibil ca intr-o iteratie oarecare ca w I , caci atunci s-ar obtine un circuit C de cost total 0, contrazicand ipoteza (I).

Din constructie se observa ca .

b)            Fie = a(D*si) i I V. Conform primei parti a demonstratiei , , satisfac sistemul (*). Presupunem ca u = (u1, . . ., un) ¹ . Cum us = = 0, rezulta ca exista i ¹ s astfel incat ui ¹ si j I V(Dsi), j ¹ i, uj = , unde Dsi este drumul construit la (a) pentru . Atunci avem:

Observatii 1. Din demonstratie rezulta ca pentru rezolvarea problemei P2 este suficient sa obtinem o solutie a sistemului (*). Drumurile corespunzatoare se obtin ca la (a). Algoritmii pe care ii vom prezenta se vor ocupa de rezolvarea sistemului (*). Totusi, daca avem ui = uk + aki atunci asa cum am vazut, k este varful dinaintea lui i de pe drumul minim de la s la i de cost ui. Rezulta ca daca in algoritmul de rezolvare a lui (*) construim un vector inainte = array[1..n] of V cu interpretarea finala 'inainte[i] = varful dinaintea lui i de pe drumul minim de la s la i', atunci varfurile acestui drum pot fi determinate in O(n) construind sirul i, inainte[i], inainte[inainte[i]], …, pana se depisteaza varful s.

2. Daca algoritmii de rezolvare a lui (*) vor evita (prin modul de actualizare a vectorului inainte) aparitia circuitelor de cost total 0, atunci se observa ca, desi nu mai are loc unicitatea solutiei sistemului (*), problema (P2) este rezolvata. Rezulta ca acesti algoritmi vor rezolva problema (P2) in conditia:

(I’) C circuit in G, a(C) ³ 0.

3. In cazul grafurilor, rezolvarea problemelor (P1) – (P3) corespunzatoare se poate face utilizand algoritmii pentru digrafuri, prin inlocuirea fiecarei muchii cu o pereche de arce simetrice de acelasi cost ca si muchia pe care o inlocuiesc. Dificultatea unei astfel de abordari rezulta din introducerea pentru muchii de cost negativ a unor circuite de lungime 2 de cost negativ. Deci, in cazul garfurilor, algoritmii pentru digrafuri sunt valabili doar daca toate costurile sunt nenegative.

4. Avand in vedere ca multimile Dij sunt finite se pot considera probleme analoage problemelor (P1) – (P3) inlocuind min cu max. Utilizarea ideii uzuale,

prin inlocuirea costurilor aij cu – aij este posibila doar in cazul digrafurilor in care pentru orice circuit C avem a(C) £ 0. In particular, aceasta abordare este posibila in cazul digrafurilor fara circuite (ca in aplicatiile b) si c) prezentate). Daca digraful initial are circuite, problemele de drum de cost maxim se pot dovedi usor prin reducerea polinomiala la probleme hamiltoniene) a NP – dificile.

Rezolvarea problemei (P2) in cazul digrafurilor fara circuite

In acest caz sortarea topologica a digrafului, care ofera o numerotare aciclica, sistemul (*) se poate rezolva prin substitutie :

begin

Sorteaza topologic G;

u1 := 0; inainte[1] := 0;

for i:=2 to n do

begin

ui :=¥;

inainte[i]:=0;

for j:=1 to i –1 do

if ui > uj + aji then

begin

ui := uj + aij;

inainte[i]:=j;

end;

end;

end.

Complexitatea pasului 2 este, evident O(1+2+…+n-1)=O(n2)

Notam ca in enuntul algoritmului am presupus ca varful s in problema (P2) devine in numerotarea aciclica varful 1, (altfel se rezolva problema P2 doar in subdigraful indus de varfurile i, care vor fi in numerotarea aciclica mai mari sau egale decat s).

Rezolvarea problemei (P2) in cazul costurilor nenegative.

Daca aij ³ 0 ij I E atunci conditia (I) este indeplinita si o solutie a sistemului (*) se poate obtine cu ajutorul urmatorului algoritm (Dijkstra, 1961) .

Se considera S V astfel incat pe tot parcursul algoritmului are loc

(D)

Daca se reuseste construirea lui S astfel incat S = V, atunci problema este rezolvata. Initial, se va considera S = si in n – 1 pasi se adauga la S cate un varf nou din V

Algoritmul lui Dijkstra

begin

S:=s; us :=0;inainte[s]:=0;

for i I V do

begin

ui := asi; inainte[i]:=s;

end;

while S ¹ V do

begin

determina j*IVS a.i. uj*=min;

S:=SU;

for j I V S do

if uj > uj* + aj*j then

begin

uj := uj* + aj*j;

inainte[j]:=j*;

end;

end;

end.

Corectitudinea algoritmului va rezulta daca vom arata ca, daca inaintea unei iteratii din pasul 2 are loc (D), atunci, dupa executia acelei iteratii, (D) are loc de asemenea .

Aratam mai intai ca in ipoteza ca (D) are loc, atunci adaugarea lui j* la S nu contrazice (D). Deci trebuie dovedit ca daca uj* = min atunci uj* = min. Presupunem ca daca exista D1sj* I Dsj* astfel incat a(D1sj*) < uj*. Fie k primul varf al drumului D1sj* (in parcurgerea sa din s), astfel incat k Ï S, atunci a(D1sj*) = a(D1sk) + a(D1kj*).

Din alegerea lui k, avem V(D1sk) S = si cum (D) are loc, avem a(D1sk) = uk. Obtinem uj* > a(D1sk*) = uk + a(D*kj) ³ uk (costurile sunt nenegative), ceea ce contrazice alegerea lui j*. Contradictia obtinuta arata ca, dupa atribuirea S := SU, prima parte a conditiei (D) are loc.

Pentru ca si cea de-a doua parte a conditiei (D) sa aiba loc dupa aceasta atribuire, sa observam ca j I V (S È ) avem min{a(Dsj) | Dsj I Dsj, V(Dsj) (S È ) = } = min(min{a(Dsj) | Dsj I Dsj, V(Dsj) S = }, min).

Cum (D) are loc, primul dintre cele doua minime de mai sus este uj. Fie aj valoarea celui de-al doilea minim si fie D1sj drumul pentru care se realizeaza. Cum j* I V(D1sj) avem aj = a(D1sj*) + a(D1j*j).

Intrucat S È satisface prima parte a lui (D), avem a(D1sj*) = uj* (altfel s-ar contrazice alegerea lui D1sj inlocuind in D1sj, portiunea D1sj* cu un drum de cost mai mic). Deci aj = uj* + a(D1j*j).

Daca drumul D1j*j este de lungime 1 atunci avem aj = uj + a(D1j*j). Altfel, considerand k varful dinaintea lui j de pe drumul D1sj avem k ¹ j, k S si aj = a(D1sk) + akj. Cum S È satisface prima parte a lui (D), obtinem aj = uk + akj.



Intrucat S satisface (D), uk este costul unui drum minim de la s la k cu varfurile continute in S deci aj este costul unui drum de la s la j cu varfurile continute in S. Rezulta ca aj ³ uj caci S satisface (D). Am obtinut ca singurul caz cand aj < uj este atunci cand aj = uj* + aj*j, situatie testata in ciclul for al pasului 2.

Rezulta ca (D) are loc pe tot parcursul algoritmului si deci valorile finale ale variabilelor ui reprezinta solutia sistemului (*). Evident, tabloul inainte este actualizat pentru memorarea implicita a drumurilor de cost minim. Complexitatea algoritmului, in descrierea data este O(n2) datorita selectarii minimelor de la pasul 2.

Observatii :

Este posibila organizarea unei cozi cu prioritate pentru memorarea valorilor ui, i I V S, astfel incat extragerea minimului sa se faca in O(1), iar actualizarile necesare in pasul 2 sa se faca in timp total de O(m log n) unde m = | E |.

Daca se doreste rezolvarea problemei (P1) cu ajutorul algoritmului lui Dijkstra, atunci la introducerea lui t in S, se poate opri algoritmul. Complexitatea, in cazul cel mai nefavorabil, ramane aceeasi. Totusi, in situatii practice concrete exista posibilitatea de a grabi introducerea lui t in S utilizand o functie de dirijare a procesului de constructie a lui S.

O functie g : V R+ se numeste estimator consistent daca :

i         (i) i I V ui + g(i) £ min

ii       (ii) ij I E g(i) £ aij + g(j).

Sa observam ca g(i) = 0, i este un estimator consistent. Daca V(G) este o multime de puncte din plan, atunci g(i) = distanta (euclidiana) de la i la t este un estimator consistent, daca sunt satisfacute conditiile (ii). Daca g este un estimator consistent atunci se poate modifica alegerea lui j* in algoritm astfel: uj* + g(j*) = min. Algoritmul ramane valabil (demonstratia este identica situatiei g(i) = 0, i si se foloseste (ii) repetat ). Avantajul este acela ca se vor introduce in S varfuri care sa ne apropie de t.

In implementarea care rezulta din descrierea algoritmului lui Dijkstra, s-a presupus (asa cum am precizat) ca se dispune de matricea de cost-adiacenta a digrafului. In cazul digrafurilor cu multe varfuri ( in care, de exemplu, listele de adiacenta sunt memorate in memoria secundara), sau in cazul digrafurilor date functional (se dispune de o procedura care construieste pentru un varf dat, lista sa de adiacenta, ca de exemplu in aplicatia c)) aceasta implementare este neeficienta, respectiv neaplicabila. O implementare care nu are aceste deficiente este urmatoarea data de Glover, Klingman si Philips (1985) ( Partition Shortest Path algorithm, PSP algorithm)

begin

us:=0; inainte[s] := 0; S := 0; NOW := s; NEXT :=Ø ;

while NOW È NEXT ¹ Ø do

begin

while NOW ¹ Ø do

begin

Extrage i din NOW;

S := S È ;

L := N+G(i);

for j I L S do

if j Ï NOW È NEXT then

begin

uj:= ui+ aij;inainte(j):=i;

introdu j in NEXT

end

else

if uj > ui + aij then

begin

uj:= ui+ aij;

inainte(j):=i;

end

end;

if NEXT ¹ Ø then

begin

determina d = min;

transfera i I NEXT cu ui = d in NOW

end

end.

Rezolvarea problemei ( P2 ) in cazul general.

Daca exista ij I E astfel incat aij < 0 algoritmul lui Dijkstra nu mai este valabil in general (introducerea lui j* in S poate conduce la violarea conditiei (D)). Considerand indeplinita conditia (I’) vom rezolva sistemul (*) prin aproximatii succesive.

Consideram i I V si m = 1, …, n-1

(BM) uim = min

Cum orice drum in G are cel mult n – 1 arce rezulta ca daca reusim constructia lui

u1= (u11, , un1), u2= (u12, , un2), …, un–1 =( u1n–1, , unn–1) , atunci un–1 este solutia sistemului (*). Algoritmul care rezulta este urmatorul:

Algoritmul lui Bellman, Ford, Moore ( aproximativ 1960 )

begin

us1:=0; for i I V do ui1:= asi ;

for m = 1 to n – 2 do

for i = 1 to n do

uim+1 := min(uim, minj¹i(ujm + aji))

end.

Pentru a demonstra corectitudinea algoritmului, aratam ca daca um (m ³ 1) satisface (BM) atunci si um+1 o satisface. Fie i I V si consideram multimile de drumuri:

A = .

B = .

C = .

Atunci A = B È C si min = min(min, min).

Cum um satisfac (BM) rezulta ca

min(a(D) | D I A) = min(uim, min). Fie min = a(D0), D0 I C. Daca j este varful ce-l precede pe i in D0 (exista, intrucat D0 are macar 2 arce) atunci a(D0) = a(D0sj) + aji ³ ujm + aji intrucat D0sj are m arce si um satisface (BM).

Rezulta ca min = min valoare care in algoritm se atribuie lui uim+1. Observam ca algoritmul are complexitate de O(n3) daca determinarea minimului din pasul doi necesita O(n) operatii. Determinarea drumurilor minime se face mentinand vectorul inainte, initializat in mod evident in pasul 1 si actualizat in mod corespunzator, la stabilirea minimului din pasul 2.

Observatii:

Daca la algoritm se adauga si pasul 3:

if ( i I V astfel incat uin-1 > minj ¹ i(uin-1 + aji)) then

“Exista circuit de cost negativ” .

se obtine posibilitatea testarii in O(n3) a existentei unui circuit de cost negativ in digraful G. In adevar, daca

(1) uin-1 > minj¹i(ujn-1 + aji) = ukn-1 + aki,

atunci, din demonstratia corectitudinii algoritmului, rezulta ca singura posibilitate este ca ukn-1 = a(D0), unde D0 IDsk are exact n – 1 arce si deci varful i I V(Dsk). Deci ukn-1 = a(D0) = a(D0si) + a(D0ik) = uin-1 + a(D0ik) (un-1 este solutie a sistemului (*), si se aplica principiul optimalitatii a lui Bellman).

Circuitul C = D0ik (k, ki, i) are costul a(C) = a(D0ik) + aki = ukn-1 – uin-1 + aki < 0, din ipoteza (1). Depistarea circuitului C se face simplu (O(n)) utilizand vectorul inainte: ( k, inainte(k), inainte(inainte(k)), …, i, k) sunt varfurile sale in ordinea inversa a parcurgerii).

2. daca k < n-1 astfel incat uk = uk+1 atunci algoritmul se poate opri.

Descriem in continuare o implementare a acestui algoritm, care are complexitatea O(nm) (m = | E |). Vom folosi o coada UQ in care se vor pastra varfurile i carora li se modifica ui curent (se va renunta, evident, la memorarea tuturor aproximatiilor succesive). Prezenta unui varf in coada se va face utilizand un vector boolean UB. Vom utiliza de asemenea un tablou nr = array[1..n] of integer care contorizeaza pentru fiecare varf i numarul modificarilor variabilei ui corespunzator lui i. Atunci cand nr(i) ³ n suntem in situatia din observatia 1 precedenta si putem opri algoritmul cu mesajul existentei circuitului negativ. Descrierea algoritmului :

begin

1: us=0; inainte(s) := 0; UQ = ; UB[s] := true; nr[s] := 1;

for i I V do

begin

ui := infinit; UB[i] := false; nr[I] := 0;

end;

2: while UQ<>0 do

begin

extrage primul element i din UQ

nr[i] := nr[i] + 1

if nr[i] >= n + 1 then

begin

“exista circuit de cost negativ ce trece prin varful i”

goto 3;

end;

UB[I] := false;

for j I A(i) do

if ui + aij < uj then

begin

uj =ui + aij;

if not UB[j] then

begin

adauga j la UQ;

UB[j] := true;

end;

end;

end;

3 : end.

Nu am mai introdus operatiile necesare intretinerii tabloului inainte intrucat sunt evidente si ar ingreuna lecturarea textului.

Rezolvarea problemei (P3).

Consideram uij = min, i,j I V. Problema se reduce la determinarea matricii U = (uij)nΧn, atunci cand se cunoaste A, matricea de cost – adiacenta. Drumurile de cost minim vor fi obtinute in O(n) daca odata cu determinarea matricii U se va construi matricea Inainte = (inainte(i, j))nΧn cu elementele avand semnificatia inainte(ij) = varful dinaintea lui j de pe drumul de cost minim de la i la j in G.

Sa observam ca daca aij ³ 0 i, j atunci, iterand algoritmul lui Dijkstra pentru s I , se obtine un algoritm de complexitate O(n3).

Daca G nu contine circuite de cost negativ, dar exista si arce de cost negativ, iterand algoritmul lui Bellman-Ford pentru s = 1..n se obtine un algoritm de complexitate O(n4). Aratam in continuare ca se poate proceda si mai eficient.

Solutia Ia . Fie a : V R a. i. i, j I E a(i) + aij ³ a(j). Consideram a*: E R+ data de

a*ij = aij + a(i) - a(j), i, j I E. Avem a*ij ³ 0 si, in plus, Dij I Dij,

(2) a*(Dij) = a(D) + a(i) - a(j).

Rezulta ca se poate itera algoritmul Dijkstra pentru obtinerea drumului de cost a* minim si din relatia (2) se observa ca un drum este de cost a* minim daca si numai daca este drum de cost a minim. Rezulta urmatorul algoritm :

determina a si construieste A* .

rezolva (P3) pentru A* construind U* si Inainte.

3. determina U (uij = u*ij - a (i) + a(j), ij).

Pasul 2 al algoritmului necesita O(n3) operatii prin iterarea algoritmului lui Dijkstra. Pasul 1 se poate realiza in O(n3) operatii, fixand s I V si rezolvand (P2) cu algoritmul Bellman – Ford. In adevar, daca ui, i I V este solutia lui (P2) atunci ui, i I V este solutie a sistemului (*), deci uj = mini¹j adica ij I E, uj £ ui + aij, deci aij + ui - uj ³ 0. Prin urmare se poate considera a(i) = ui, i I V.

Solutia a II-a.

Fie uijm = min } i, j, m I

Atunci, evident uij1=aij i, j I V (presupunem, din nou matricea A avand elementele diagonale egale cu 0). In plus,

uijm+1 = min i, j I V, m = 1, 2, , n

Aceasta ultima relatie se poate justifica inductiv: un drum de cost minim de la i la j care nu are varfuri interioare ³ m + 1 poate sa nu contina varful m, si atunci are costul uijm, sau poate contine varful m, si atunci, din principiul optimalitatii al lui Bellman si ipoteza inductiva, este uimm + umjm.

Evident, daca se obtine uiim < 0 atunci digraful contine un circuit de cost negativ C care trece prin varful i, cu V(C) . Aceasta solutie a problemei (P3) este cunoscuta ca algoritmul lui Floyd -Warshal si poate fi descris astfel:

begin

1: for i:=1 to n do

for j:=1 to n do

begin

inainte(i,j):=i;

if i = j then

begin

aii := 0; inainte(i, i):=0

end

end;

2: for m:=1 to n do

for i:=1 to n do for j:=1 to n do

if aij>aim+amj then

begin

aij:=aim+amj;

inainte(i,j):=inainte(m,j)

if (i=j and aij<0) then

begin

“circuit negativ” ;

goto 3

end

end;

3: end.

Evident, complexitatea algoritmului este de O(n3).

Observatie. Daca digraful nu contine circuite de cost negativ, atunci initializand

aii :=0, valorile finale ale elementelor diagonale dau costul minim al cate unui circuit ce trece prin varful corespunzator.

Teorema lui Menger si aplicatii ale acesteia.

Definitie. Fie G = (V, E) (di)graf si X,Y V. Numim XY – drum in G orice drum D in G de la un varf x I X la un varf y I Y, astfel incat

V(D) X = si V(D) Y = .

Vom nota cu D(X, Y; G) multimea tuturor XY-drumurilor in G .

Sa observam ca daca x I X Y atunci drumul de lungime 0 , D = , este XY-drum.

Vom spune ca drumurile D1 si D2 sunt disjuncte daca V(D1) V(D2) = Ø.

Probleme practice evidente, din retelele de comunicatie, dar si unele probleme legate de conexiunea garfurilor si digrafurilor, necesita determinarea unor multimi de XY – drumuri disjuncte si cu numar maxim de elemente. Vom nota cu p(X, Y; G) numarul maxim de XY – drumuri disjuncte in (di)graful G. Teorema care precizeaza acest numar a fost stabilita de Menger in 1927 si constituie unul din rezultatele fundamentale din teoria garfurilor.

Definitie. Fie G = (V, E) un digraf si X, Y V. Numim multime XY – separatoare in G o multime Z V astfel incat D I D(X, Y; G), V(D) Z ¹ Ø.

Notam cu S(X, Y; G) = si k(X, Y; G) = min. Din definitie, rezulta urmatoarele proprietati imediate ale multimilor XY – separatoare:

(a)    Daca Z I S(X, Y; G) atunci D I D(X, Y; G) D nu este drum in G – Z.



(b)   X, Y I S(X, Y; G)

(c)    Daca Z I S(X, Y; G) atunci A astfel incat Z A V avem A I S(X, Y; G).

(d)   Daca Z I S(X, Y; G) si T I S(X, Z; G) sau T I S(Z , Y; G) atunci T I S(X, Y; G)

Teorema 1. Fie G = (V, E) (di)graf si X, Y V. Atunci

p(X, Y; G) = k(X, Y; G).

Demonstratie: 10. Daca p = p(X, Y; G) si D1, D2, …, Dp sunt XY – drumuri disjuncte in G, atunci Z I S(X, Y; G) avem Z V(Di) ¹ Ø si cum Di sunt disjuncte (i = 1, p): |Z| ³ |Z Èip=1 V(Di)| =

=åi=1, p |Z V(Di) | ³ åi=1, p 1 = p.

Deci Z I S(X, Y; G) |Z| ³ p; in particular k(X, Y; G) ³ p(X, Y; G).

20. Aratam prin inductie dupa a(G) = | V | + | E | ca

(*) G = (V, E) , X, Y V, k(X, Y; G) XY – drumuri disjuncte in G.

(Evident din (*) rezulta ca p(X, Y; G) ³ k(X, Y; G) si deci teorema e demonstrata). Cum (*) se verifica pentru (di)grafuri G cu a(G) = 1, 2, consideram in pasul inductiv ca (*) are loc pentru orice (di)graf G' si orice X', Y' V(G'), cu a(G') < a(G). Pentru a exclude cazurile banale, vom presupune ca X Y, Y X si k = k(X, Y; G) > 0.

Cazul 1. Exista Z I S(X, Y; G) a. i. |Z| = k, Z ¹ X, Y .

Consideram VXZ = si VZY = .

Sa observam ca VXZ VZY = Z (daca exista v I VXZ È VZY – Z, atunci se obtine ca Z nu este XY – separatoare; daca exista z I Z a. i. z Ï VXZ VZY atunci Z – este XY – separatoare, contrazicand | Z | = k(X, Y; G)). Pe de alta parte, exista x I X – Z (daca X Z, atunci cum X I S(X, Y; G) si | Z | = k(X, Y; G) rezulta X = Z, contrazicand ipoteza cazului 1) si evident x Ï VZY (altfel, Z nu ar fi XY – separatoare). Rezulta |VZY| < | V |. In mod similar |VXZ| < | V |.

Fie GXZ = [VXZ]G si GZY = [VZY]G. Din observatiile precedente: a(GXZ), a(GZY) < a(G).

Sa observam ca k(X, Z; GXZ) = k si k(Z, Y; GZY) = k (Z este XZ – separatoare in GXZ, respectiv ZY – separatoare in GZY si are cardinalul k; daca in unul din cele doua grafuri, ar exista o multime T separatoare de cardinal < k, atunci, utilizand observatia (d), se contrazice definitia lui k pentru G, X si Y).

Din ipoteza inductiva, rezulta ca exista k X Z – drumuri disjuncte in GXZ si k Z Y – drumuri disjuncte in GZY. Cum VXZ VZY = Z si | Z | = k, rezulta ca aceste 2k drumuri se pot concatena doua cate doua in G si deci (*) are loc.

Cazul 2. Z X Y – separatoare a. i. | Z | = k avem Z = X sau Z = Y.

Presupunem, pentru precizarea notatiilor, Z = X. Cum X Y, x I X Y. X – nu este XY – separatoare (are mai putin de k elemente). Exista deci un XY – drum in G. Fie e = xy prima muchie (arc) a acestui drum (exista!). Sa observam ca y Ï X. Consideram G' = G - e. Avem a(G') < a(G), deci (*) are loc pentru G', X si Y.

Daca k(X, Y; G') = k, atunci cele k XY – drumuri disjuncte din G' sunt XY – drumuri disjuncte si in G deci (*) are loc pentru G, X si Y.

Daca k(X, Y; G') < k, atunci in G' exista Z' XY – separatoare cu | Z' | = k – 1 (se aplica, eventual proprietatea (c)). Z' nu este XY – separatoare in G (| Z' | < k). Singurele XY – drumuri pe care Z nu le intersecteaza sunt cele care au drept prima muchie (arc) pe e. Din definitia lui k, rezulta ca x Ï Z', y Ï Z' si |Z' È | = |Z' È | = k. Din alegerea lui x, y avem Z' È ¹ Y si Z' È ¹ X. Din ipoteza cazului 2, rezulta atunci ca Z' È = X si Z' È = Y. Cele k drumuri din (*) sunt in acest caz zIZ' si (x, xy, y).

Cu acestea , teorema este demonstrata.

Observatii :

10 Egalitatea min-max din enuntul teoremei este interesanta si conduce, asa cum vom vedea, la rezultate importante, in cazuri particulare.

20. Teorema se poate demonstra si algoritmic ca o consecinta a teoremei fluxului maxim-sectiunii minime.

Forma echivalenta in care a fost enuntata si demonstrata initial de Menger (1927) teorema 1 este:

Teorema 1'. Fie G = (V, E) un (di)graf si s, t I V, astfel incat s ¹ t , st Ï E. Exista k drumuri intern disjuncte de la s la t in graful G daca si numai daca indepartand mai putin de k varfuri diferite de s si t, in graful ramas exista un drum de la s la t.

Notam ca doua drumuri sunt intern disjuncte daca nu au varfuri comune cu exceptia extremitatilor. Se observa ca daca se considera X = NG(s) si Y = NG(t) (respectiv, N+G(s) si N–G(t) in cazul digrafurilor) teorema 1' se obtine imediat din teorema 1. Reciproc, o constructie inversa celei de mai sus asupra tripletului G, X, Y din teorema 1, arata ca teorema 1 se obtine din teorema 1'.

Am definit un graf G p – conex (p I N* ) daca G = Kp sau daca | G | > p si G nu poate fi deconectat prin indepartarea a mai putin de p varfuri. Utilizand teorema 1' obtinem.

Consecinta. Un graf G este p – conex daca G = Kp sau st I E() exista p drumuri intern disjuncte de la s la t in G.

Determinarea numarului k(G) de conexiune a grafului G (cea mai mare valoare a lui p pentru care G este p–conex) se reduce deci la determinarea lui p(, ; G) problema care vom dovedi ca se poate rezolva in timp polinomial.

Un caz particular interesant al teoremei 1, se obtine atunci cand G este un graf bipartit iar X si Y sunt cele doua clase ale bipartitiei :

Teorema 2. (Konig,1931) Daca G = (S, R; E) este un graf bipartit, atunci cardinalul maxim al unui cuplaj este egal cu cardinalul minim al unei multimi de varfuri incidente cu toate muchiile grafului.

Demonstratie: Evident, cardinalul maxim al unui cuplaj in G este p(S, R; G), care este egal, conform teoremei 2, cu k(S, R; G). Teorema rezulta imediat daca observam ca o multime de varfuri este SR – separatoare daca si numai daca este incidenta cu orice muchie a grafului.

O aplicatie, fundamentala in numeroase rationamente combinatorii, a acestei teoreme este teorema lui Hall (1935).

Definitie : Fie I si S multimi finite nevide. Numim familie de submultimi ale lui S (indexata dupa I) orice aplicatie A : I 2S. Vom nota familia A = (Ai; i I I) si vom folosi notatia functionala uzuala A(J) = UjIJAj (pentru J I).

Daca A = (Ai; i I I) este o familie de submultimi ale lui S, o functie rA : I S cu proprietatea ca rA(i) I Ai, i I I se numeste functie de reprezentare pentru familia A. In acest caz, (rA(i); i I I) formeaza un sistem de reprezentanti a familiei A. Daca functia de reprezentare rA este injectiva atunci rA(I) S se numeste sistem de reprezentanti distincti ai familiei A, sau transversala.

Problema centrala in teoria transversalelor este aceea de a caracteriza familiile A care admit transversale (eventual cu anumite proprietati). Prima teorema de acest tip a fost stabilita de Hall in 1935 :

Teorema 3. Familia A = (Ai; i I I) de submultimi ale lui S admite o transversala daca si numai daca

(H) | A(J) | ³ | J | J I.

Demonstratie: Necesitatea este evidenta : daca A admite o functie rA de reprezentare injectiva atunci J I , rA(J) A(J) si deci | A(J) | ³ | rA(J) | ³ | J | (intrucat rA este injectiva).

Suficienta. Consideram graful bipartit GA = (I, S; E) unde am presupus I S = Ø (altfel, se considera copii izomorfe disjuncte) iar E = . Se observa ca NGA(i) = Ai si ca A are o transversala daca si numai daca GA are un cuplaj de cardinal |I|. In ipoteza ca (H) are loc, aratam ca orice multime de varfuri incidenta cu toate muchiile lui GA are macar | I | elemente, ceea ce dovedeste existenta cuplajului de cardinal | I | (utilizand teorema 2).

Fie X = I' È S' Ì I È S o multime de varfuri incidenta cu toate muchiile. Rezulta ca NGA(I – I') S', adica A(I – I') S'. Atunci, | X | = | I' | + | S' | ³ | I' | + |A(I – I')|. Folosind conditia (H) obtinem in continuare: | X | ³ | I' | + |A(I – I')| ³ | I' | + |I – I'| = | I |.

Structura garfurilor p-conexe

Lema 1. Fie G = (V, E) p-conex, | V | ³ p + 1, U V, | U | = p si x I V – U. Exista in G p xU – drumuri cu singurul varf comun x.

Demonstratie: Consideram graful G' = (V È , E'), unde E' = E È . G' este p-conex . In adevar, oricare A cu | A | £ p – 1 G' - A este conex (daca z I A, acest lucru este evident din p-conexiunea lui G; daca A V atunci G' – A este conex intrucat G – A este conex si y I U cu zy I E(G' – A)).

Lema rezulta, aplicand teorema 1' grafului G' si perechii x, z.

Lema 2. Daca G = (V, E) este un graf p-conex p ³ 2, atunci doua muchii e1 si e2 si p – 2 varfuri x1, …, xp–2 exista un circuit in G care le contine.

Demonstratie: Inductie dupa p.

Daca p = 2, trebuie sa dovedim ca in orice graf 2-conex, prin orice doua muchii trece un circuit. Consideram G' obtinut din G prin insertia cate unui varf pe muchiile e1(a) si e2(b). Noul graf este tot 2-conex, deoarece orice varf am scoate, nu se pierde conexiunea. Exista deci in G' doua ab – drumuri disjuncte, care in G ofera un circuit ce contine e1 si e2.

Fie p > 2 si presupunem afirmatia adevarata pentru orice graf k-conex, k < p. Fie G p-conex.

Putem presupune ca extremitatile muchiilor e1 si e2 nu sunt printre x1, …, xp-2, deoarece altfel, afirmatia ar rezulta prin inductie. Graful G – xp–2 este (p – 1)-conex. Conform ipotezei inductive exista un circuit C ce contine x1, …, xp–3 si e1, e2. Fie Y multimea varfurilor lui C, | Y | ³ p. Folosind lema 2, exista in G p xp–2y drumuri cu y I Y, disjuncte. Putem presupune ca pentru un drum xp–2y, y este primul varf din Y intalnit, asa ca aceste drumuri au cate un singur varf comun cu Y. Dam o orientare circuitului si numerotam varfurile sale conform acestei orientari. Avem deci drumurile

. Varfurile y1, …, yp descompun circuitul in drumurile .

Exista un drum dintre acestea, in care nu este continut nici unul de elementele x1, …, xp–3, e1, e2. Fie acest drum ; atunci

este un circuit ce contine x1, x2, …, xp–2, e1 si e2, si lema este demonstrata.

Teorema 4. (Dirac 1953) Daca G = (V, E) este un graf p-conex p ³ 2, atunci prin orice p varfuri ale sale trece un circuit.

Demonstratie. Fie x1, …, xp–1, xp p – varfuri oarecare a lui G. Deoarece graful G este conex, exista e1 = xxp–1 si e2 = yxp si aplicam lema 3.

Aplicam aceasta teorema precum si idea utilizata in demonstratia lemei 2, pentru a demonstra o conditie suficienta de hamiltonietate interesanta datorata lui Erdos si Chvatal (1972).

Teorema 5. Fie G p-conex. Daca a(G) < p atunci G este hamiltonian.

Demonstratie: Presupunem ca G nu este hamiltonian. Vom obtine o contradictie. Cum G este p-conex , un circuit de lungime cel putin p (conform teoremei lui Dirac de mai sus). Fie C un circuit de lungime maxima in G. Daca G nu este hamiltonian, v Ï C. Intrucat | C | ³ p, conform lemei 2, exista p vC-drumuri disjuncte (cu exceptia lui v) fie ele (numerotarea varfurilor este in ordinea intalnirii lor intr-o parcurgere fixata a circuitului). Notam, pentru fiecare vi cu wi varful succesor al lui vi in parcurgerea lui C.

Atunci, vwi Ï E, caci altfel am avea circuitul vwi, wi, C –wivi, de lungime mai mare decat C. Cum a(G) £ p, atunci multimea nu este stabila. Deci, exista wswt I E. Dar atunci: , drumul (invers) pe C de la vs la wt , muchia wtws , drumul (invers) pe C de la ws la vt si este un circuit de lungime mai mare decat C, contrazicand ipoteza ca C este de lungime maxima.






Politica de confidentialitate



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1801
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2022 . All rights reserved

Distribuie URL

Adauga cod HTML in site