Documente Academic
Documente Profesional
Documente Cultură
Anatol Gremalschi
GRAFURI
metodologia predrii n cadrul instruirii
de performan la disciplinele
Matematic & Informatic
Chiinu, 2013
Corlat, Sergiu.
Grafuri : Metodologia predrii n cadrul instruirii de performanta la disciplinile
Matematic & Informatic : [pentru uzul studenilor] /
Sergiu Corlat, Anatol Gremalschi;
Acad. de tiinte a Moldovei, Univ. de Stat din Tiraspol. Chiinu.
Universitatea de Stat din Tiraspol, 2014. - 158 p. - (informatica)
100 ex.
ISBN 978-9975-76-122-2.
519.17+004.421.2(075.8)
C71
Cuprins
Introducere............................................................................................................7
Capitolul 1. Noiuni generale.................................................................................9
1.1 Definiii ........................................................................................................9
1.2 Structuri de date pentru reprezentarea unui graf ....................................15
Exerciii: ...........................................................................................................18
Capitolul 2. Parcurgeri. Conexitate......................................................................19
2.1 Parcurgerea grafului ..................................................................................19
2.2 Grafuri tare conexe....................................................................................23
Algoritmul Kosaraju .........................................................................................24
2.3 Probleme rezolvate ...................................................................................26
Exerciii: ...........................................................................................................32
Capitolul 3. Mulimi independente .....................................................................33
3.1 Mulimi independente...............................................................................33
3.2 Generarea tuturor mulimilor maximal independente .............................34
Exerciii ............................................................................................................39
Capitolul 4. Colorri .............................................................................................40
4.1 Numrul cromatic......................................................................................40
4.2. Algoritmul exact de colorare ....................................................................41
4.3. Algoritmi euristici de colorare ..................................................................42
Exerciii: ...........................................................................................................44
Capitolul 5. Drumuri minime n graf ....................................................................45
Preliminarii ......................................................................................................45
Exerciii ..........................................................................................................104
Capitolul 10. Fluxuri n reea .............................................................................105
10.1 Preliminarii ............................................................................................105
10.2.Algoritm .................................................................................................106
10.3 Flux maxim cu surse i stocuri multiple ................................................113
10.4 Flux maxim pe grafuri bipartite ............................................................114
10.5 Flux maxim pe grafuri cu capaciti restricionate ale vrfurilor i
muchiilor........................................................................................................115
Exerciii ..........................................................................................................121
Capitolul 11. Cuplaje .........................................................................................122
11.1 Cuplaje ...................................................................................................122
11.2 Graful asociat.........................................................................................123
11.3 Funcia de generare a grafului asociat ..................................................124
11.4 Generarea tuturor cuplajelor maxime ..................................................125
11.5 Probleme rezolvate ...............................................................................127
Exerciii ..........................................................................................................131
Capitolul 12. Probleme propuse pentru rezolvare ............................................132
14.1 Cratere pe Lun .....................................................................................132
12.2 Translatori .............................................................................................133
12.3 Problema celor cinci dame ....................................................................134
12.4 mprirea administrativ-teritorial ......................................................134
12.5 Safeuri....................................................................................................135
14.7 Plicuri i felicitri ...................................................................................137
12.7 Agenii ...................................................................................................138
12.8 Interogri ...............................................................................................139
12.9 Import galactic.......................................................................................140
12.10 Incendiator ..........................................................................................142
vbcb
Introducere
Aprute din necesitatea de a modela diverse situaii, relaii sau
fenomene n form grafic, grafurile i-au gsit o multitudine de
aplicaii n cele mai diverse sfere ale activitii umane: construcii i
sociologie, electrotehnic i politologie, chimie i geografie acest ir
poate fi continuat la nesfrit.
Teoria grafurilor a luat natere de la problema podurilor din
Konigsberg, cercetat de Euler i s-a dezvoltat ca un compartiment al
matematicii clasice pn la momentul apariiei sistemelor electronice de
calcul i a teoriei algoritmilor. n contextul rezolvrii problemelor de
calcul automat, grafurile s-au dovedit a fi un instrument universal i
extrem de flexibil, devenind un compartiment al matematicii aplicate.
O adevrat revoluie a cunoscut-o teoria grafurilor n anii 60
80 ai secolului trecut, cnd a fost stabilit posibilitatea de utilizare a lor
pentru rezolvarea problemelor de optimizare. Algoritmii pentru
determinarea drumului minim, punctelor mediane, centrelor, de
maximizare a fluxurilor, dar i multe altele au devenit componente
vitale ale cercetrilor operaionale i a metodelor de optimizare.
n aspect informatic grafurile apar i n calitate de structuri
eficiente de date, n special arborii, care permit realizarea optim a
algoritmilor de sortare i cutare.
Numrul de lucrri, care studiaz aspectele algoritmice ale
teoriei grafurilor este unul impuntor. Printre primele apariii se
numr Applied graph theory de Wai-Kai Chen; Graph Theory. An
Algorithmic approach de Nicos Christofides; urmate de Algorithmic
ghaph theory de Alan Gibbons, Algorithms in C de Thomas Sedgewick i
multe alte ediii. Totui, majoritatea ediiilor se axeaz doar pe
descrierea matematic a algoritmilor, fr a le suplini prin
implementri ntr-un limbaj de programare sau altul, or, tocmai
implementarea algoritmic este pentru programatorii practicieni o
component de importan maxim.
n prezenta lucrare se ncearc abordarea vertical a
algoritmilor clasici ai teoriei grafurilor: de la noiuni teoretice, definiii
7|P age
8|P age
1.1 Definiii
Def. Graf neorientat (graf) o pereche arbitrar G (V , E ) E {u, v}: u, v V & u v
Def. Graf orientat (graf) o pereche arbitrar
G (V , E ) , n care E V V
V
formeaz mulimea vrfurilor
grafului, E mulimea muchiilor. De obicei
vrfurile grafului sunt reprezentate n plan
prin puncte sau cercuri iar muchiile prin
segmente care unesc vrfurile.
Pentru
graful
din
desenul
1.1
2
1
2
1
9|P age
u, v ,
adiacente muchiei.
Grade
Def.
Gradul vrfului
acestuia2.
(vi ) .
vi .
Pentru
vrful
din
graful
reprezentat
pe
desenul
1.2
10 | P a g e
Subgrafuri
Def. Subgraf al grafului G (V , E ) se numete orice graf G (V , E)
astfel nct V V , E E .
Subgrafurile se obin din graful iniial fie prin excluderea
muchiilor, fie prin excluderea muchiilor i vrfurilor din graful iniial.
n cazul cnd din graful iniial se exclude vrful vi , odat cu el se
exclud i toate muchiile incidente acestuia. Excluderea muchiei (u, v)
nu presupune i excluderea din graf a vrfurilor u, v.
Dac n subgraful G (V , E) are loc relaia V V , subgraful
este unul bazic (desenul 1.3 B). Subgraful
GS' (VS , ES )
VS V , ES E
se numete
vi VS , (vi ) (vi )
subgraf
generat
n care
2
1
2
1
Des 1.3 Graful iniial (A), subgraf bazic (B), subgraf generat (C).
11 | P a g e
Tipologia grafurilor
Def.
Def.
Des 1.4
Graf complet K5 (A),
graf bipartit (B).
v V A , v V B (v, v) E
Graful bipartit complet cu pri formate din n i m vrfuri se
noteaz K n ,m (desenul 1.5)
Def.
Des. 1.5
Graful bipartit complet K3,3
Def.
A
B
Des. 1.6 Graf conex (A), graf neconex (B)
nmr 2
unde: n numrul de vrfuri ale grafului, m numrul de muchii, r
numrul de fee.
m 0. n 1& r 1. 1 0 1 2.
Fie teorema este adevrat pentru m k.
Se adaug nc o muchie
n k r 2.
m k 1.
13 | P a g e
Dac
muchia
unete
dou
vrfuri
existente,
atunci
r r 1.
n (k 1) (r 1) n k r 1 1 n k r 2.
Dac muchia unete un vrf existent cu unul nou, atunci n n 1.
(n 1) (k 1) r n k r 1 1 n k r 2.
2 nmr nm
2m
6 3n 3m 2m m 3n 6
3
Ponderi
n unele cazuri muchiile grafului posed caracteristici numerice
suplimentare, numite ponderi. Muchiei (arcului) (vi , v j ) i se pune n
coresponden valoarea ci , j - ponderea (costul, lungimea etc.). Graful,
muchiilor cruia -i sunt asociate ponderi se numete graf cu muchii
ponderate. Pentru rezolvarea unor probleme este necesar i aplicarea
ponderilor la vrfurile grafului. Vrfului vi i se pune n coresponden
caracteristica numeric ci - ponderea (costul). Graful, vrfurilor cruia i sunt asociate ponderi se numete graf cu vrfuri ponderate.
Dac graful G (V , E ) este unul ponderat, atunci pentru cile
din graf se introduce caracteristica numeric l - cost (lungime) egal cu
suma ponderilor muchiilor din care este format o cale C .
l (C )
( vi ,v j )C
14 | P a g e
ci , j
0
0
1
1
1
2
3
4
(3,4)
0
1
0
1
(2,4)
(3,4)
0
1
1
0
(3,2)
(2,4)
1
0
0
1
(1,4)
( ,3)
1
1
0
0
(2,1)
(1,4)
1
2
3
4
Des. 1.2
(1,2)
Des.1.1
+1
-1
0
0
-1
0
0
+1
0
+1
-1
0
0
+1
0
-1
0
0
-1
+1
acest caz ineficient, deoarece doar cte dou elemente din fiecare linie
vor conine date real utilizabile.
G (V , E ) este
(i, j ) al
tabloului.
Pentru grafurile din des. 1.1,1.2 matricele de adiacen vor fi
Des. 1.1
1
0
1
2
1
0
3
1
4
2
1
0
1
1
3
0
1
0
1
4
1
1
1
0
Des. 1.2
1
0
1
1
2
0
3
0
4
2
0
0
1
0
3
0
0
0
0
4
1
1
1
0
Des. 1.2
(1,2)(1,4)(2,3)(2,4)(3,4)
(1,4)(2,1)(2,4)(3,2)(3,4)
16 | P a g e
17 | P a g e
Exerciii:
1. Pentru grafurile din imagini construii:
a)
b)
c)
d)
matricea de inciden;
matricea de adiacen;
lista de muchii;
lista de vecini.
i afiarea ei pe
18 | P a g e
u.
Una dintre cele mai eficiente metode de parcurgere n graf este
parcurgerea n adncime4. La baza metodei st principiul de
selectare recursiv a vrfurilor i etichetare a lor. Iniial toate vrfurile
se consider neatinse. Fie v0 vrful de la care ncepe parcurgerea. v0 se
eticheteaz ca fiind atins. Se alege un vrf u , adiacent v0 i se repet
procesul, pornind de la u . n general, fie v vrful curent. Dac exist
un vrf u , nou (neatins), adiacent v ( (v, u) E ), atunci procesul se
repet pornind de la u. Dac pentru vrful curent v nu mai exist
vrfuri vecine neatinse, el se eticheteaz ca fiind cercetat, iar procesul
de parcurgere revine n vrful precedent (din care s-a ajuns n v ). Dac
4
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
1
1
1
1
1
1
1
1
1
1
1
1
2
0
2
0
2
0
2
0
2
0
2
0
3
0
3
0
3
1
3
1
3
1
3
1
4
0
4
0
4
0
4
1
4
2
4
2
5
0
5
0
5
0
5
0
5
0
5
1
6
0
6
1
6
1
6
1
6
1
6
1
Pas 7
Pas 8
Pas 9
Pas 10
Pas 11
Pas 12
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
1
1
1
1
1
1
1
1
1
1
1
2
2
1
2
2
2
2
2
2
2
2
2
2
3
1
3
1
3
1
3
2
3
2
3
2
4
2
4
2
4
2
4
2
4
2
4
2
5
1
5
1
5
2
5
2
5
2
5
2
6
1
6
1
6
1
6
1
6
2
6
2
O( N 2 ) . Odat
Pas 1
atins
cercetat
atins
cercetat
atins
cercetat
atins
cercetat
Pas 2
Pas 3
Pas 4
Pas 5
6
1
2
1
3
1
Pas 6
3
6
5
6 2
Pas 7
atins
cercetat
atins
cercetat
atins
cercetat
5 4
1 6 2 3
4
1 6 2 3 5
1 6 2 3 5 4
22 | P a g e
v j ) i v j cu vi ( v j
v j i v j
vi .
este
GT (V , ET ) unde
ET (vi , v j ) : (v j , vi ) E . Graful
1 dac Aj ,i 1
AiT, j
i, j 1,..., n
0 n caz contrar
Exemplu: desenul 2.1: Graful iniial G (V , E ) i graful transpus
GT (V , ET ) , reprezentate grafic.
23 | P a g e
Algoritmul Kosaraju
Pseudocod
Pas 1. Se construiete graful GT (V , ET ) .
Pas 2. Se lanseaz cutarea n adncime pornind de la fiecare vrf
T
necercetat din G . Pentru fiecare parcurgere se memoreaz
24 | P a g e
Exemplu de implementare:
Se folosete matricea de adiacen a pentru reprezentarea
grafului iniial, at pentru reprezentarea grafului transpus, vectorul b
pentru descrierea strii vrfurilor, vectorul black pentru ordinea de
cercetare.
Input: Graful G (V , E ) .
Output: componentele tare conexe ale grafului, separate pe linii.
int DFS_DIR (int s) { // . . . descrisa anterior - DFS }
int DFS_TRANS (int s)
{ int i;
b[s]=1;
for(i=1;i<=n;i++)
if( at[s][i] !=0 && b[i]==0) DFS_TRANS(i);
//amplasarea in stiva ordinii de cercetare
k++; black[k]=s;
return 0;
}
int main()
{ // . . .citirea datelor initiale
// transpunerea grafului
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==1) at[j][i]=1;
// Cautarea in adancime pe graful transpus
for(i=1;i<=n; i++) if (b[i]==0) DFS_TRANS(i);
// resetarea starii varfurilor
for(i=1;i<=n;i++) b[i]=0; printf("\n");
// parcurgerea in adancime pe graful initial
for(i=n;i>=1;i--) //Afisarea componentelor tare conexe
if (b[black[i]]==0) {DFS_DIR(black[i]); printf("\n");}
return 0;
}
25 | P a g e
complexitate
O( N 2 ) .
Prin
urmare,
complexitatea
total
algoritmului este O( N ) .
2
8
0
0
0
0
1
0
0
ROBOT.OUT
12
0
1
0
0
1
2
0
0
1
0
0
1
1
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
1
1
1
1
0
0
0
0
0
0
2
Timpul minim
se obine n cazul n care toi roboii se
adun n ptrelul aflat la intersecia rndului 1 i a coloanei 2. Pe
desenul de mai sus acest ptrel este marcat printr-un punct.
Rezolvare
Pentru a rezolva problema, vom simula deplasarea fiecrui robot
cu ajutorul unei unde numerice. Pentru a nu confunda undele numerice
ale fiecruia din roboi, vom crea cte un cmp de lucru pentru fiecare
din ei.
Presupunem c se dorete simularea undei numerice a unuia din
roboi. Vom nota prin k valoarea undei numerice. Evident, n cazul
ptrelului n care se afl robotul,
. Pentru a propaga unda
numeric, nscriem n toate ptrelele libere, care sunt vecine cu
27 | P a g e
28 | P a g e
29 | P a g e
procedure NumaraRobotii;
{ Inscrie in r numarul de roboti }
var i, j : integer;
begin
r:=0;
for i:=1 to n do
for j:=1 to m do
if C[1][i, j]=2 then r:=r+1;
end; { NumaraRobotii }
procedure InitializeazaCampurile;
var i, j, p, q : integer;
begin
{ cream r exemplare ale campului de lucru }
for p:=2 to r do C[p]:=C[1];
{ lasam pe fiecare camp cate un singur robot }
for p:=1 to r do
begin
q:=0;
for i:=1 to n do
for j:=1 to m do
if (C[p][i, j]=2) then
begin
q:=q+1;
if (p<>q) then C[p][i, j]:=0;
end;
end;
end; { InitializeazaCampurile }
procedure PropagaUndaNumerica(var A : CampDeLucru);
{ Propaga unda numerica in campul A }
var i, j : integer;
k : integer;
{ valoarea curenta a undei numerice }
Ind : boolean; { indicator }
begin
k:=1;
repeat
k:=k+1;
Ind:=true;
for i:=1 to n do
for j:=1 to m do
if A[i, j]=k then
begin
if A[i-1, j]=0 then
begin A[i-1, j]:=k+1; Ind:=false; end;
if A[i+1, j]=0 then
begin A[i+1, j]:=k+1; Ind:=false; end;
30 | P a g e
Exerciii:
1. Simulai, pe pai, pentru graful
din imagine, parcurgerea n lime,
pornind de la vrful 1.
2. Simulai, pe pai, pentru graful
din imagine, parcurgerea n
adncime, pornind de la vrful 1.
32 | P a g e
este o
(S ) .
33 | P a g e
G (V , E ) . Numrul G max Q
SQ
se va numi numr de
34 | P a g e
Motivarea algoritmului
Algoritmul se bazeaz pe arborele de cutare. Prin urmare, este
eficient realizarea lui recursiv.
n general, la pasul k mulimea independent S k se extinde prin
adugarea unui vrf nou, pentru a obine la pasul k 1 mulimea Sk 1 .
Procesul se repet att timp, ct este posibil adugarea vrfurilor noi.
La momentul, n care nu mai putem aduga vrfuri, avem obinut o
mulime maximal independent.
Fie Qk - mulimea maximal de vrfuri, pentru care la pasul k
avem ( Sk )
b) construirea mulimii Sk 1 Sk
c) formarea
Qk1 Qk ( xik )
(*)
x
ik
Qk a unui vrf x Qk : ( x) Qk
Prezena n
(**)
Optimizarea algoritmului
Optimizarea poate fi obinut din contul apariiei ct mai rapide
a pasului de ntoarcere. Prin urmare, se va ncerca ndeplinirea ct mai
grabnic a condiiei (**). O metod sigur (n special pentru grafuri
mari) este de a alege mai nti n Qk un vrf x , pentru care valoarea
( x) ( x) Qk
Pseudocod
Pas 1.
S0 Q0 , Q0 V , k 0.
Adugarea vrfurilor
Pas 2. Este selectat un vrf
k
Verificarea posibilitii de continuare
Pas 3. Dac exist x Qk
: ( x) Qk
se trece la pasul 5,
altfel - la pasul 4.
Pas 4.
a)
b)
c)
36 | P a g e
Micarea napoi
Pas 5. k
a)
b)
Se reconstruiesc Qk , Qk : Qk Qk xik
c)
Qk xik
apelurilor
recursive.
Restriciile
de
dimensiune
r=j+1;
for (i=r;i<=n;i++)
if (q[i]==1)
{ fillc(rest,0,n);
s[i]=1; q[i]=0;
for (j=1;j<=n;j++)
if (a[i][j] != 0 && q[j]==1)
{q[j]=0; rest[j]=1;}
mind (s,q);
// micarea inainte
s[i]=0;q[i]=1; //micarea napoi
for (j=1;j<=n;j++)
if(rest[j]==1) q[j]=1;
}
}
return 0;
}
int main()
{
readdata();
fillc(s,0,n); fillc(q,1,n);
mind(s,q); return 0;
}
38 | P a g e
5 10
7 8
8 10
9 10
3 7 8 11
3 9 11
4 6 9
4 7
6 9 11
5
6 9 10
9 10 11
10 11
Exerciii
1. Pentru graful din imagine, determinai:
a) mulimea maxim
independent de putere
minim;
b) mulimea maxim
independent de putere
maxim.
2. Completai implementarea prezentat mai sus cu subprogramele
lips i structurile de date necesare pentru a avea un program
funcional, ce va realiza algoritmul pentru grafuri cu |V| < 30.
3. Realizai o modificare a programului elaborat n exerciiul 2,
care va verifica i toate optimizrile indicate n descrierea
algoritmului (3.2).
4. Elaborai o funcie pentru generarea aleatorie de grafuri i
estimai statistic timpul mediu de lucru al algoritmilor elaborai
n exerciiile de mai sus n funcie de numrul de vrfuri i
muchii ale grafului.
39 | P a g e
Capitolul 4. Colorri
n acest capitol:
( K n ) 1, ( Kn ) n , ( Kn ,n ) 2 , (T ) 2 , etc.
1
40 | P a g e
2 n n 1
n 1
n
Fr demonstraie
Teorema 3. n orice graf planar exist un vrf de grad nu mai mare
dect cinci. (corolar din formula Euler)
[12, pag. 40]
Teorema 4. (celor 5 culori). Pentru orice graf planar (G) 5 .
[4, pag. 285]
Ipoteza (celor 4 culori). Orice graf planar poate fi colorat cu patru
culori.
41 | P a g e
Iniializare V {1,..., n} C [ ] 0,
se
Pas 3.
iniializeaz
cu
0.
k 1 . Vectorul culorilor
Culoarea
activ
Ct V se repet
Pentru fiecare v V
Pentru fiecare u (v)
Dac C [u ] k , se trece la urmtorul v
C[v] k ; V V v
k
Implementare
Input: Graful G : matricea de adiacen a, structura vrfurilor v.
Output: O colorare posibil a grafului G , n vectorul culorilor c.
int sort ()
{ // sorteaz vrfurile n descreterea gradelor }
int readdata()
{ // citete graful G. matricea de adiacen }
42 | P a g e
1.
int printcc()
{ // afieaz o colorare a grafului G }
int nocolor()
{ verific prezena vrfurilor necolorate }
int main(int argc, char *argv[])
{ int j,i,r;
readdata();
// initializare
for (i=1;i<=n;i++)
{v[i].ind=i;
for (j=1; j<=n;j++) v[i].grad+=a[i][j];
}
// sortare
sort();
// colorare
k=1;
fillc(c,0,n);
while (nocolor())
{ for( i=1;i<=n;i++)
{ if (c[v[i].ind]==0)
{ r=0;
for (j=1;j<=n;j++)
if (a[v[i].ind][j] != 0 && c[j]==k) r++;
if (r==0) c[v[i].ind]=k;
}
}
k++;
}
printcc();
return 0;
}
43 | P a g e
Exerciii:
1. Pentru grafurile din imaginile de mai jos determinai (G) :
V 10 . Implementai
un
program
care
va
determina
colorarea
44 | P a g e
Preliminarii
Ponderea unei muchii (u, v)
45 | P a g e
toate
vrfurile
vi ( p)
care
nu
au
marcaje
distan
ale
Dac
se
modific
Se consider p vi*
Pas 4. (Repetarea iteraiei)
Dac p = t atunci
x, l x .sursa .
Se consider
Des. 5.2
47 | P a g e
Iniializarea
Vrf
distana
sursa
marcaj
1
0
1
p
10
Iteraia 1
Vrf
distana
sursa
marcaj
1
0
1
p
2
10
1
t
4
5
1
t*
7
6
1
t
10
Iteraia 2
Vrf
distana
sursa
1
0
1
2
10
4
5
5
10
7
6
8
10
10
marcaj
1
t
*
7
6
1
p
8
10
4
t
10
10
10
30
5
t
Iteraia 3
Vrf
distana
sursa
marcaj
1
0
1
p
2
10
1
t*
4
5
1
p
Iteraia 4
Vrf
distana
sursa
marcaj
1
0
1
p
2
10
3
30
4
5
5
10
6
18
7
6
8
10
1
p
2
t
1
p
4
t*
2
t
1
p
4
t
Iteraia 5
Vrf
distana
sursa
marcaj
1
0
1
p
2
10
3
30
4
5
5
10
6
18
7
6
8
10
1
p
2
t
1
p
4
p
2
t
1
p
4
t*
Iteraia 6
Vrf
distana
sursa
marcaj
1
0
1
p
2
10
3
30
4
5
5
10
6
18
7
6
8
10
9
30
10
30
1
p
2
t
1
p
4
p
2
t*
1
p
4
p
8
t
5
t
Iteraia 7
48 | P a g e
5
10
4
t
Vrf
distana
sursa
marcaj
1
0
1
p
2
10
3
30
4
5
5
10
6
18
7
6
8
10
9
30
10
24
1
p
2
t
1
p
4
p
2
p
1
p
4
p
8
t
6
t*
Implementare
Graful este descris prin matricea de adiacen a. Marcajele se pstreaz
n tabloul liniar vert cu elemente tip articol, avnd componentele
distana, sursa, stare.
int find()
{ // fuctia returneaza indicele varfului cu marcaj temporar
//de valoare minima. Daca nu exista, returneaza 0.
}
int tipar()
{ // functia afiseaza tabloul de marcaje
}
int main()
{ // citire date
// formare marcaje
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++) k+=a[i][j];
k++;
for (i=1;i<=n;i++)
{vert[i].dist=k; vert[i].sursa=i; vert[i].stare=0;}
vert[s].stare=1; vert[s].dist=0;
// repetare iteratii
while (find ())
{ p=find();
49 | P a g e
for(i=1;i<=n;i++)
if (a[p][i] !=0 && vert[i].stare !=2 )
{ dc= vert[p].dist+a[p][i];
if(dc<vert[i].dist){vert[i].dist=dc; vert[i].sursa=p;}
vert[i].stare=1;
}
vert[p].stare=2;
}
// afisare rezultate
tipar();
return 0;
}
Pseudocod
Pas 0. (Preprocesare). Fie dat matricea distanelor C, n care
i j
0,
C[i ][ j ] di , j , (i, j ) E
,
(i, j ) E
Pas 1. (Iniializare) k 0
Pas 2
50 | P a g e
Pas 3
Pas 4
Implementare
Graful este descris prin matricea de adiacen a, care ulterior
este transformat n matricea distanelor.
int main()
{
// citire date iniiale
// modelare infinit
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
p+=a[i][j];
p++;
// creare matrice costuri
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==0 && i != j) a[i][j]=p;
// calculare drumuri minime
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
if (i!=k && a[i][k]!=p)
51 | P a g e
for (j=1;j<=n;j++)
if (j!=k && a[k][j] !=p)
if (a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
// afisare rezultate
return 0;
}
RETELE.OUT
2
Restricii:
Tabloul
iniial
L=1
L=2
L=0
Fig. 5.4
programul
ce
urmeaz
nn
reeaua
de
calculatoare
este
54 | P a g e
procedure Citeste;
var I, j : integer;
begin
assign(Intrare, 'RETELE.IN');
reset(Intrare);
readln(Intrare, n);
for i:=1 to n do
for j:=1 to n do R[i, j]:=0;
for i:=1 to n do
begin
while not eoln(Intrare) do
begin read(Intrare, j); R[i, j]:=1; end;
readln(Intrare);
end; { for }
readln(Intrare, a, b);
end; { Citeste }
procedure Scrie;
{ Scrierea datelor in fisierul de iesire }
begin
assign(Iesire, 'RETELE.OUT');
rewrite(Iesire);
writeln(Iesire, Z[b]);
close(Iesire);
end; { Scrie }
procedure UndaNumerica;
{ Propagarea undei numerice }
var i, j, L : integer;
begin
for i:=1 to n do Z[i]:=-1;
Z[a]:=0;
L:=0;
while Z[b]=-1 do
begin
for i:=1 to n do
if Z[i]=L then
for j:=1 to n do
if (R[i, j]=1) and (Z[j]=-1) then
Z[j]:=L+1;
L:=L+1;
end; { while }
end; { UndaNumerica }
begin
Citeste;
UndaNumerica;
Scrie;
end.
55 | P a g e
56 | P a g e
Exerciii
1. Determinai distana minim ntre vrfurile indicate pe grafurile
de mai jos:
39
14
57 | P a g e
Centre n graf
Centre interioare i exterioare
Raza grafului
Algoritmi exaci pentru determinarea centrului
6.1 Divizri
0
Pentru orice vrf vi al grafului G (V , E ) prin R (vi ) se va nota
mulimea de vrfuri v j ale grafului G care pot fi atinse din vi prin ci,
t
ce nu depesc mrimea . Prin R (vi ) se va nota mulimea de vrfuri
R (v ) v : d v , v , v V
R0 (vi ) v j : d vi , v j , v j V
t
58 | P a g e
s0 (vi ) max d vi , v j
v j V
st (vi ) max d v j , vi
v j V
v1
v2
v3
v4
v5
v6
v7
v8
s0
v1
v2
v3
v4
v5
2
*
v6
v7
v8
st
3
*
3
*
st (vi ) au valori finite pentru orice i numai dac graful este tare conex.
59 | P a g e
Vrful v0* pentru care are loc relaia s0 (v0 ) min s0 (vi ) se
*
vi V
vi V
grafului G.
Centrul exterior este vrful (sau vrfurile) care minimizeaz cea
mai lung distan de la el spre oricare alt vrf al grafului. Din
matricea distanelor el poate fi determinat ca minimul valorilor maxime
de pe fiecare linie. Pentru graful de pe desenul 6.1 centrul exterior este
vrful 5. Centrul interior este vrful (sau vrfurile) care minimizeaz
cea mai lung distan spre el de la oricare alt vrf al grafului. Din
matricea distanelor el poate fi determinat ca minimul valorilor maxime
de pe fiecare coloan. Pentru graful de pe desenul 6.1 centre exterioare
sunt vrfurile 4 i 8. ntr-un graf neorientat centrul interior i cel
exterior coincid.
Def.
vi V
vi V
interioar a grafului G.
Pentru graful de pe desenul 6.1 raza exterioar are valoarea 2, n
timp ce raza interioar are valoarea 3.
Pentru un graf neorientat raza interioar i raza exterioar sunt
egale, iar centrele exterioare coincid cu cele interioare.
Def.
vi V
vi V
grafului G.
60 | P a g e
Def.
Vrful v0* pentru care are loc relaia s(v0 ) min s(vi ) se
*
vi V
6.3 P-centre
Vom porni de la o situaie frecvent ntlnit. Fie c ntr-un ora
sunt amplasate mai multe (P) centre de asisten medical urgent, cu
echipe mobile de medici. n cazul recepionrii unei cereri de asisten
la centrul comun de apel, ctre solicitant se deplaseaz echipajul de
medici de la cel mai apropiat centru de asisten.
n acest caz amplasarea iniial a celor P centre de asisten
medical urgent este organizat ntr-un mod, care asigur minimul de
ateptare a pacientului, indiferent de locaia acestuia.
d Vp , vi min d v j , vi .
v j V p
s0 (V p ) max d V p , v j
v j V
st (V p ) max d v j , V p
v j V
61 | P a g e
Def.
Mulimea
de
vrfuri
V p*,0
pentru
care
are
loc
relaia
Mulimea
de
vrfuri
V p*,t
pentru
care
are
loc
relaia
Def.
*
Valoarea s0 (Vp ,0 ) min s0 (Vp ) se numete p-raza exterioar a
V p G
*
grafului G. Valoarea st (Vp ,t ) min st (Vp ) se numete p-raza
V p G
interioar a grafului G.
62 | P a g e
Pseudocod
Pas 0. Se formeaz matricea distanelor minime (algoritmul Floyd).
Pas 1. Se alege n calitate de aproximare iniial a p-centrului o
mulime arbitrar de vrfuri C. Vrfurile v j V C vor fi
considerate avnd marcajul strii egal cu 0 (neverificate).
Pas 2. Se alege un vrf arbitrar de stare 0 v j V C i pentru fiecare
vrf vi C se calculeaz valorile i , j s(C ) s(C {vi } {v j }) .
Pas 3. Se determin i0 , j max i , j .
vi C
i.
ii.
63 | P a g e
6.4
Probleme rezolvate
Megacoli8
Enun Pe insula Tortuga sunt N localiti(numerotate de la 1 la N).
Guvernatorul insulei, fostul corsar Ion Vrabie, a hotrt s construiasc
dou megacoli moderne, la care vor merge copii din toate localitile.
Copiii din fiecare localitate urmeaz s mearg la cea mai apropiat
dintre megacoli.
Guvernatorul dorete s selecteze localitile n care vor fi
construite megacolile astfel, nct timpul necesar pentru a ajunge la
megacoal din cea mai ndeprtat localitate s fie ct mai mic posibil.
Funcionarii au ntocmit o hart a insulei, pe care sunt indicate
localitile i segmentele de drumuri care unesc unele perechi de
localiti. Pentru fiecare segment de drum care unete dou localiti
este cunoscut timpul necesar pentru ca copiii s ajung dintr-o
localitate n cealalt. Pentru oricare dou localiti de pe insul exist
cel puin o secven de segmente de drum, care le unete.
Note:
a. un segment de drum ncepe la ieirea dintr-o localitate i se termin
la intrarea n alta. El nu trece prin careva localiti intermediare.
b. Pentru a asigura securitatea copiilor, interseciile segmentelor de
drum sunt denivelate nu poi trece de pe un segment de drum pe
altul n afara localitilor.
c. Timpul de deplasare n interiorul localitii se neglijeaz (se
consider 0)
d. Timpul de deplasare pe o secven de segmente de drum este egal cu
suma timpilor de deplasare pe fiecare segment de drum, inclus n
secven.
school.out
1 2 2
Explicaii
Rezolvare
Problema se rezolv n dou etape.
1. Determinarea timpului minim, necesar pentru a ajunge din
localitatea cu indicele i n localitatea cu indicele j (pentru toi i,j de la 1
la N.)
65 | P a g e
Implementare (C)
#include <stdio.h>
#include <stdlib.h>
int n,i,j,l,k,p=0,a[101][101],b[101],c[101],bestsol,
currentsol;
struct pereche{int v1;int v2;} best, current;
FILE *f, *g;
int tipar()
{ int i,j;
for (i=1; i<=n; i++)
{
for (j=1;j<=n; j++)
printf("%5d", a[i][j]);
printf("\n"); }
return 0; }
int readdata()
{ int i,j;
f=fopen("00-schl.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n; j++)
fscanf(f, "%d", &a[i][j]);
fclose(f);
return 0; }
int floyd()
{ int i,j,k;
// modelare infinit
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++) p+=a[i][j];
p++;
// matrice cost
66 | P a g e
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==0 && i != j) a[i][j]=p;
// floyd
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
if (i!=k && a[i][k]!=p)
for (j=1;j<=n;j++)
if (j!=k && a[k][j] !=p)
if (a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
return 0;
}
int min(int x, int y)
{if (x<y) return x; else return y; }
int main()
{ readdata();
floyd();
tipar();
g=fopen("00-schl.cor", "w+");
bestsol=p;
for (i=1;i<n;i++)
for (j=i+1;j<=n;j++)
{ current.v1=i; current.v2=j;
for (k=1;k<=n;k++)
{
for (l=1;l<=n;l++)
b[l]=min(a[l][i],a[l][j]);
c[k]=0;
for (l=1;l<=n;l++) if (c[k]<b[l]) c[k]=b[l];
}
currentsol=c[1];
for (l=1;l<=n;l++)
if (c[l]<currentsol) currentsol=c[l];
if (bestsol>currentsol)
{bestsol=currentsol; best=current;}
}
fprintf(g, "%d %d %d\n", best.v1, best.v2, bestsol);
fclose(g);
return 0;
}
67 | P a g e
Exerciii:
Des. 6.2.
68 | P a g e
Capitolul 7. Mediane
n acest capitol:
Mediane n graf
Mediane interioare i exterioare
Algoritmi exaci pentru determinarea medianei
7.1 Mediane
Mai multe probleme de amplasare a punctelor de deservire presupun minimizarea sumei distanelor de la o serie de puncte terminale
pn la un punct central (de colectare, comutare, depozite etc.)
Punctele care corespund soluiei optime ale problemei se numesc
puncte mediane ale grafului.
Fie graful G (V , E ) . Pentru fiecare vrf vi se definesc dou
valori, care se numesc indici de transmitere:
0 (vi )
t (vi )
d v , v
v j V
d v , v
v j V
Vrful
v0
pentru care
0 v0 min 0 vi
vi V
vt
se numete
pentru care
69 | P a g e
v2
v3
v4
v5
v6
v7
v8
v1
15
v2
22
v3
16
v4
15
v5
10
v6
18
v7
21
v8
20
15
15
14
19
21
12
16
v1
25
7.3 P-mediane
Noiunea de p-median se introduce prin analogie cu noiunea de
p-centru.
d Vp , vi min d v j , vi
(*)
v j Vp
(**)
Dac vj este vrful din V p , pentru care se obine valoarea minim a (*)
sau (**), se spune c vi este arondat la vj .
Indicii de transmitere pentru mulimea V p se calculeaz la fel ca i
pentru vrfurile solitare:
0 (Vp )
Def.
Mulimea
d V , v ,
v j V
de
vrfuri
V p ,0
t (Vp )
d v ,V
v j V
pentru
care
are
loc
relaia
numete
p-median
interioar
grafului G.
Pentru un graf neorientat p-mediana exterioar i cea interioar
coincid, prin urmare se cerceteaz doar noiunea de p-median, ca
mulime de vrfuri, care minimizeaz suma distanelor pn la toate
celelalte vrfuri ale grafului.
mari ale n sau valori ale p apropiate de n/2. n particular, pentru valori
ale lui n, p, ce nu depesc 20, poate fi folosit un algoritm clasic de
generare a submulimilor unei mulimi, descris n [9, p. 32]. O
modificare elementar va permite generarea doar a mulimilor din p
elemente, ceea ca va reduce considerabil timpul de lucru al
algoritmului. O alt component a soluiei este calcularea matricei D a
distanelor minime, care va servi n calitate de surs de date pentru
determinarea p-medianei.
Algoritmul euristic
Pentru valori mari ale lui n i p poate fi folosit un algoritm
euristic, similar algoritmului pentru determinarea p-centrului.
Pas 0. Se formeaz matricea distanelor minime (algoritmul Floyd).
Pas 1. Se alege n calitate de aproximare iniial a p-medianei o
mulime arbitrar de vrfuri C. Vrfurile v j V C vor fi
considerate avnd marcajul strii egal cu 0 (neverificate).
Pas 2. Se alege un vrf arbitrar de stare 0 v j V C i pentru fiecare
vrf vi C se calculeaz valorile i , j (C ) (C {vi } {v j })
Pas 3. Se determin i0 , j max i , j .
vi C
i.
Dac i0 , j 0 vrful
Dac i0 , j 0 , C C {vi } {v j }
vrful
v j este marcat
72 | P a g e
Implementare
Input: Graful
}
} while (delta>0);
tipar(); printf(" %d ", calcmed());
return 0; }
Exemplu:
x.in
X.out
4
0
3
4
2
1
3
0
2
5
4
2
0
3
2
5
3
0
Explicaii
Pentru vrful 1 distana total este 18
Pentru vrful 2 distana total este 20
Pentru vrful 3 distana total este 18
Pentru vrful 4 distana total este 20
Distana total minim este 18, se obine pentru localitile 1 i 3. Indicele
minim 1.
Rezolvare:
Este o problem-tip, unde se cere s se determine mediana ntr-un graf
neorientat. Datele iniiale corespund matricei distanelor n graful, care
descrie schema de comunicaii ntre toate localitile. Astfel, rmne
doar de calculat sumele elementelor din fiecare linie a tabelului, dup
care s se determine suma minim i indicele primei linii, n care
aceasta se obine.
Implementare:
#include <stdio.h>
#include <stdlib.h>
int n,i,j,a[101][101],b[101], bestsol;
FILE *f, *g;
int readdata()
{ int i,j;
f=fopen("fabrik.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n; j++)
fscanf(f, "%d", &a[i][j]);
fclose(f);
return 0;
}
int main()
{
readdata();
75 | P a g e
g=fopen("fabrik.out", "w+");
for (i=1;i<=n;i++)
{ b[i]=a[i][1];
for (j=2;j<=n;j++)
b[i]+=a[i][j];
}
bestsol=1;
for (i=2;i<=n;i++) if (b[i]<b[bestsol]) bestsol=i;
fprintf(g, "%d %d", bestsol, b[bestsol]*2);
fclose(g);
}
Exerciii:
Des 7.1
un
program
pentru
determinarea
medianelor
V 200 .
G (V , E ),
V 20 .
76 | P a g e
V 20 .
G (V , E ),
V 100 .
G (V , E ),
V 100 .
77 | P a g e
Capitolul 8. Arbori
n acest capitol:
2
1
este
arbore
G* (V , T ) T E
2
1
4
3
ramuri, cele din E / T - corzi. Des. 8.1. Graful (stnga sus) i cteva dintre
Numrul carcaselor unui carcasele sale
graf este determinat de
structura acestuia.
Algoritmii de parcurgere a unui graf conex permit i construirea
concomitent a unei carcase. ntr-adevr, proprietatea de conexitate
asigur atingerea fiecrui nod u a grafului pe parcursul lucrului
algoritmului. Pentru nodul u, atins din v, algoritmii de parcurgere nu
78 | P a g e
mai permit atingerea repetat din alt nod. Prin urmare, apariia
ciclurilor n procesul parcurgerii este imposibil.
Urmtoarea modificare a funciei DFS, studiat n capitolele
precedente, afieaz lista muchiilor pentru carcasa ce corespunde
parcurgerii n adncime a grafului:
int DFS (int s)
{ int i;
b[s]=1;
for(i=1;i<=n;i++)
if(a[s][i] !=0 && b[i]==0)
{printf("\n %d - %d", s, i); DFS(i);}
return 0;
}
79 | P a g e
ik.
Muchia curent ei (v, v) . Pe graful T se lanseaz funcia
(ii)
(iii)
T T
ei , c c 1
carcasele, care
ncep
de
la muchia ek .
Algoritm
Pas 1.
k 0.
Pas 2
80 | P a g e
de
muchii
carcas
c 0.
Pas 3. CARCASE(k,0).
Pas 4
Implementare
Input: Graful G : matricea de adiacen a; lista de muchii v.
Output: Arborii pariali a grafului G , generai consecutiv n tabloul
arb.
int tipar()
{ .. //afieaz soluia curent matricea de adiacen a
arborelui parial}
int scoatemuchie(int ind)
{ // exclude muchia cu
construcie}
int punemuchie(int ind)
{ // include muchia
construcie}
cu
indicele
indicele
ind
ind
din
arborele
arborele
6
5
10
15
0
0
10
6
0
0
15
0 10
0 4
4 0
0 0
0
0
5
9
1
6
20
10
6 0
0 0
0 0
0 20
0 20 0
8 5 0
0 0 10
0 0 6
0 15 0
0 5 9
8 0 0
5 0 0
0 10 6
0 0 0
0 0 0
0 0 0
S (G* )
( v ,u )T
cv ,u
Algoritmul Kruskal
Fie G (V , E ) un graf ponderat cu n vrfuri. Algoritmul Kruskal
folosete tehnica greedy i presupune crearea unui graf G* (V , T ) , n
care iniial T . Ulterior, muchiile din G se sorteaz dup creterea
ponderilor. La urmtoarea etap se efectueaz adugarea consecutiv
*
n G a muchiilor din irul sortat, cu condiia c la adugarea muchiei
Pseudocod:
Pas 1. Se construiete G* (V , T ) , T .
Pas 2. Muchiile din G (V , E ) se sorteaz n ordinea creterii
ponderilor. Se obine irul m1 ,..., m E .
Pas 3.
k 0, i 1 .
Pas 4. While k V 1 do
*
a) if T mi nu formeaz un ciclu n G , then
T T mi , k ;
b)
i.
83 | P a g e
Implementare:
Input: Graful G : matricea de adiacen a; liata de muchii v; arborele
parial de cost minim arb, tabloul componentelor conexe c.
Output: Un arbore parial de cost minim a G , n tabloul arb.
int sort ()
{ // functia de sortare a listei de muchii }
int readdata()
{ // functa de citire a datelor initiale }
int printv()
{ // functia de tipar a rezultatelor}
int makeedgelist()
{ // functia pentru crearea listei de muchii }
int main(int argc, char *argv[])
{ int j,i,r;
readdata();
makeedgelist();
sort();
for (i=1;i<=n;i++) c[i]=i; // initializare componente conexe
i=0;
while(k<n-1)
{ i++;
if (c[v[i].vi] != c[v[i].vj])
// verificare posibilitate adaugare muchie
{k++; arb[k]=v[i];
for(j=1;j<=n;j++)
if (c[j] == c[v[i].vj] ) c[j]=c[v[i].vi];
}
}
printv(); // afisare rezultate
return 0;
}
Algoritmul Prim
Spre deosebire de algoritmul Kruskal, algoritmul Prim
genereaz arborele parial de cost minim prin extinderea unui singur
84 | P a g e
Pseudocod
Pas 1.
Se construiete G* (V , T ) , T .
Pas 2.
Pas 3.
consider nefolosite.
k 0.
Pas 4.
Ct timp k V 1 :
a)
i 1.
b)
Implementare
Input: Graful G : matricea de adiacen a; lista de muchii v; arborele
parial de cost minim arb, tabloul c de stare a nodurilor (se folosete
pentru a modela starea muchiilor).
Output: Un arbore parial de cost minim a G , n tabloul arb.
int sort ()
{ // functia de sortare a listei de muchii }
int readdata()
{ // functa de citire a datelor initiale }
int printv()
85 | P a g e
C1
C3
C2
C4
C5
C6
x
Fig. 1
RETELE.OUT
1.442958120348338E+001
2.
Dij ( xi x j ) 2 ( yi y j ) 2 .
Program Retele;
{ Clasele 7-9 }
var X, Y : array[1..200] of Real;
Total : Real;
n : Integer;
procedure Citire;
var f : Text;
var i : Integer;
begin
Assign(f,'RETELE.IN');
Reset(f);
readln(f, n);
for i:=1 to n do Readln(f, X[i], Y[i]);
Close(f);
end;
Procedure Scriere;
var f : Text;
begin
Assign(f, 'RETELE.OUT');
rewrite(f);
Writeln(f, Total);
close(f);
end;
function Dist(i, j : Integer) : Real;
begin
Dist:=sqrt(sqr(X[i]-X[j])+sqr(Y[i]-Y[j]));
end;
88 | P a g e
89 | P a g e
begin
Citire;
Prim;
Scriere;
end.
90 | P a g e
Exerciii
Des. 8.3
V 20 .
G (V , E ),
V 20 .().
G (V , E ),
V 20 .
91 | P a g e
Capitolul 9. Cicluri
n acest capitol:
v(G) m n p m (G) se
numete
numrul
De remarcat c ciclul Ci se
Cicluri independente dac conin cel puin cte o muchie, care aparine
doar unuia din ele
92 | P a g e
10
a
b
c
Desenul 9.1 Graful G (a), un arbore parial T (b), ciclurile fundamentale (c)
Pentru
graful
G : n 6, m 9, p 1 .
Numrul
ciclomatic
modific
93 | P a g e
Cicluri Euler
Def.
94 | P a g e
Des. 9.4 Graf fr ciclu i lan eulerian (a), cu ciclu eulerian (b), cu lan eulerian (c).
(ii)
95 | P a g e
Pas 0.
L .
98 | P a g e
int main()
{ readdata();
if (verif()==0) {printf ("/n Graful nu este eulerian /n ");
return 0;}
lan();
do {
exclude_cic();
if (exist()!=0)
{ ciclu();
insert(pr);
print(l);
}
} while (exist()>0);
return 0;
}
Des. 9.5 Ilustrarea rezultatelor generate de program. Lanul iniial 6-3 (a). Cicluri
de cretere 6-4-3-5-6 (b), 6-7-8-6 (c), 7-1-4-7 (d), 1-2-3-1 (e).
99 | P a g e
i, j
100 | P a g e
Pseudocod (Roberts-Flores)
Pas 1. Se formeaz tabloul M [mi , j ] de dimensiuni
k n ,
n care
vi
v vi .
101 | P a g e
exist doar
v j i v v j
.
Pas 4. Se repet pasul 3 pn la apariia uneia din situaiile descrise
n 3(a) sau 3(b).
Pas 5. Fie S (v1 , v2 , vk 1 , vk ) . S S vk . Dac S , v vk 1
apoi se trece la pasul 3, altfel STOP toate secvenele posibile
au fost cercetate.
Implementare (recursiv)
Urmtorul program determin lanuriler hamiltoniene. Matricea
de adiacen este stocat n tabloul a, soluiile se formeaz n tabloul s.
Programul permite urmrirea dinamicii construciei lanurilor
hamiltoniene. Tehnica de implementare reluarea.
#include <conio.h>
#include <stdio.h>
int a[30][30], m[30][30], s[30], n,i,j,k,ne;
FILE *f;
int readdata()
{ int i,j;
f=fopen("dataham.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
fscanf(f, "%d", &a[i][j] );
fclose(f);
return 0;
}
int make_m()
{ int i,j,k;
for (i=1;i<=n;i++)
{ k=0;
for (j=1;j<=n;j++)
if ( a[i][j] != 0)
{ k++;
102 | P a g e
m[k][i]=j;
}
}
}
int print_s(int q)
{ int i;
printf("\n");
for (i=1; i<=q; i++) printf("%d ", s[i]);
getch();
return 0;
}
int exist (int a,int pos)
{ int i,k=0;
for (i=1;i<=pos;i++)
if (s[i] == a) k=1;
return k;
}
int hamilton(int element, int index)
{ int i,j;
if (exist (element, index-1)) return 0;
s[index]=element;
if (index==n) { printf("\n solutie "); print_s(index);
index--; return 0;}
else { index++;
j=1;
do
{ hamilton(m[j][element], index); j++; }
while (m[j][element] !=0);
index--;
}
return 0;
}
int main()
{ readdata();
make_m();
hamilton(1,1);
return 0;
}
103 | P a g e
Exemplu
Exerciii
1. Elaborai un program pentru verificarea existenei unui ciclu
Euler ntr-un graf G (V , E ),
V 20 .
V 20 .
104 | P a g e
V 20 .
10.1 Preliminarii
Problema fluxului maxim, la fel
ca multe alte probleme formulate pe
grafuri, i are rdcinile n economia
modern, mai exact n optimizarea
economic. Mai recente sunt aplicaiile
n domeniul reelelor i fluxurilor
informaionale. Dac este cercetat o Des. 10.1.
reea de transportare a unui material Reea de transport cu sursa n vrful
din un punct n care acesta este produs 1 i stocul n vrful 10.
(surs) ntr-un punct de depozitare sau
prelucrare (stoc) prin canale de transport cu anumite capaciti,
inevitabil apare problema determinrii capacitii de transportare a
materialului de la surs ctre stoc pentru toat reeaua. Materialul i
canalele de transport pot avea cea mai divers natur: produse
petroliere i conducte; piese i transportoare; pachete de date i canale
informaionale, etc.
Pe grafuri problema se formuleaz astfel: Este dat un graf
orientat G (V , E ) , cu ponderi anexate arcelor: pentru arcul (i, j )
ponderea este ci , j . Pentru dou vrfuri date s, t V se cere s se
105 | P a g e
10.2.Algoritm
Descriere general
Algoritmul se bazeaz pe determinarea iterativ a unor drumuri
de cretere a fluxului i acumularea acestora ntr-un flux total, pn la
apariia n reea a unei tieturi11, care separ sursa de stoc.
Se cerceteaz graful G (V , E ) cu capacitile arcurilor ci , j ,
sursa s i stocul t ( s, t V ). Pe arcuri se definesc marcajele ei , j , care
vor indica valoarea curent a fluxului de-a lungul arcului (i, j ) . Pentru
marcajele arcurilor se va respecta urmtoarea condiie:
w vi s
ei , j ek ,i w vi t
1
v j ( vi )
vk ( vi )
0 v s , t
i
Prin alte alte cuvinte, sursa s produce un flux de mrime w.
Pentru orice vrf intermediar fluxul de intrare este egal cu fluxul de
ieire. n stocul t intr un flux de mrime w.
Problema fluxului maxim se reduce la determinarea unui w:
v j ( s )
ei ,s
vk ( t )
ek ,t max .
11
Tietura n graf const dintr-un set de muchii (arcuri), lichidarea crora divide graful n
dou componente conexe.
106 | P a g e
V0 i sfritul n V0 , sau w V0 V0
Tietura
w Vm Vm
minim
(Vm Vm )
ci , j .
este
tietura
vi ,v j V0 V0
pentru
care
min
ci, j
V0 V0 vi ,v j V0 V0
Notaii:
Pentru implementarea algoritmului vor fi folosite att marcaje
pentru arcuri ct i marcaje pentru vrfurile grafului. Marcajul unui
vrf v este format din trei componente: precedent, flux, stare, care au
semnificaia:
precedent vrful care l precede pe v n drumul de cretere
curent
flux mrimea fluxului, care ajunge n vrful v pe drumul de
cretere curent
stare starea curent a vrfului v (vrful poate fi n una din trei
stri: necercetat [marcaj nul, valoarea - 0], atins[vecin al unui vrf
cercetat, valoarea - 1], cercetat[toi vecinii atini, valoarea - 2]).
Vecinii vrfului x
( x) : V V : z V , ( x, z) E (mulimea vrfurilor
n care se poate ajunge direct din vrful x).
( x) : V V : z V , ( z, x) E (mulimea
vrfurilor
Pseudocod
Pas 0. Marcajele arcurilor se iniializeaz cu 0.
Pas 1. Marcajele vrfurilor se iniializeaz: precedent 0, stare 0,
flux . Marcajele muchiilor se pstreaz.
107 | P a g e
vi , ,1 , unde min(v , e j ,i ) .
i
ez ,v ez ,v c ,
altfel, dac vrful v are marcajul de tip z, ,* valoarea
fluxului de-a lungul arcului (v, z) este micorat cu c :
ev, z ev, z c ;
c.
12
Exemplu
Graful 10.1. Sursa - vrful 1, stocul vrful 10.
ITERAIA 1
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
2
3
4
5
7
:
:
:
:
:
:
2-(1,30,1); 3-(1,30,1);
5-(2,30,1);
4-(3,10,1); 9(3,10,1)
7-(4,10,1);
8-(5,25,1);
10 -(7,10,1);
nod
precedent
1
1
2
1
3
1
4
3
5
2
flux
stare
30 30 10 30
2 2 2 2 2
6
0
7
4
8
5
1-(1,,2 )
2-(1,30,2)
3-(1,30,2)
4-(3,10,2)
5-(2,30,2)
7-(4,10,2)
9
3
10
7
0 10 25 10
0 2 1 1
10
1
ITERAIA 2
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
2
3
5
4
7
:
:
:
:
:
:
2-(1,30,1); 3-(1,20,1);
5-(2,30,1);
9(3,10,1)
4-(5,10,1); 8-(5,25,1);
7-(4,8,1);
10 -(7,8,1);
2
1
3
1
4
5
8
5
1-(1,,2 )
2-(1,30,2)
3-(1,20,2)
5-(2,30,2)
4-(5,10,2)
7-(4,8,2)
nod
precedent
1
1
5
2
6
0
7
4
9
3
10
7
flux
stare
30 20 10 30
2 2 2 2 2
0
0
8 25 10
2 1 1
8
1
ITERAIA 3
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
2
3
5
4
8
:
:
:
:
:
:
2-(1,22,1); 3-(1,20,1);
5-(2,22,1);
9(3,10,1)
4-(5,2,1); 8-(5,22,1);
1-(1,,2 )
2-(1,22,2)
3-(1,20,2)
5-(2,22,2)
4-(5,2,2)
8-(5,22,2)
6-(8,5,1);10 -(8,22,1);
nod
precedent
1
1
2
1
3
1
flux
stare
22 20
2 2 2
4
5
5
2
6
8
7
0
8
5
9
3
10
8
2 22
2 2
5
1
0 22 10
0 2 1
22
1
109 | P a g e
ITERAIA 4
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
3
9
4
2
5
7
:
:
:
:
:
:
:
3-(1,20,1);
9(3,10,1)
4-(9,5,1); 7-(9,10,1);
2-(4,5,1); 5-(-4,5,1)
1-(1,,2 )
3-(1,20,2)
9-(3,10,2)
4-(9,5,2)
2-(4,5,2)
5-(-4,5,2)
7-(9,10,2)
8-(5,3,1)
10-(7,7,1)
nod
precedent
1
1
2
4
3
1
flux
stare
5 20
2 2
4 5
9 -4
6
0
5
2
0 10
0 2
5
2
7
9
8
5
9
3
10
7
3 10
1 2
7
1
ITERAIA 5
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
3
9
4
2
5
7
8
:
:
:
:
:
:
:
:
3-(1,13,1);
9(3,3,1)
4-(9,3,1); 7-(9,3,1);
2-(4,3,1); 5-(-4,3,1)
8-(5,3,1)
10-(8,3,1)
nod
precedent
1
1
2
4
flux
stare
3 13
2 2
110 | P a g e
1-(1,,2 )
3-(1,13,2)
9-(3,3,2)
4-(9,3,2)
2-(4,3,2)
5-(-4,3,2)
7-(9,3,2)
8-(5,3,2)
3
1
4 5
9 -4
6
8
7
9
8
5
9
3
10
8
3
2
3
1
3
2
3
2
3
2
3
1
3
2
Implementarea algoritmului
Urmtorul fragment de cod realizeaz o variant didactic a
algoritmului pentru determinarea fluxului maxim n reea. Reeaua din
N vrfuri este descris prin matricea de adiacen A[NN], marcajele
arcurilor (fluxul generat) se pstreaz n tabloul E[NN], marcajele
vrfurilor n tabloul VERT[N].
#include <conio.h>
#include <stdio.h>
int a[30][30], e[30][30],i,j,n,s,t, delta, big=0;
struct vertex{int flux; int sursa; int stare;} vert[30];
FILE *f;
int readdata()
{ int i,j;
f=fopen("flux.in", "r");
fscanf(f, "%d", &n);
fscanf(f, "%d %d", &s, &t);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{fscanf(f, "%d", &a[i][j]); big+=a[i][j];}
fclose(f);
return 0;
}
int init_vert()
{ int i;
for (i=1;i<=n;i++)
{vert[i].flux=big; vert[i].sursa=vert[i].stare=0;}
vert[s].stare=1; vert[s].sursa=+s;
return 0;
}
int activ()
{
int i;
for (i=1;i<=n;i++)
if (vert[i].stare ==1) return i;
return 0;
}
111 | P a g e
int fluxtotal()
{ int i,ft=0;
for (i=1;i<=n;i++) ft+=e[s][i];
return ft;
}
int abs(int x)
{ if (x<0) return x*-1; else return x;
}
int flux()
{ int x,i,d,q;
// miscarea inainte, constructie lant
do
{ x=activ();
//dupa G+
for (i=1;i<=n;i++)
if (vert[i].stare==0 && a[x][i]>0 && e[x][i]<a[x][i])
{ d=a[x][i]-e[x][i];
if ( d<vert[x].flux) vert[i].flux=d;
else vert[i].flux=vert[x].flux;
vert[i].stare=1; vert[i].sursa=+x;
};
// dupa Gfor (i=1;i<=n;i++)
if (vert[i].stare==0 && e[i][x]>0)
{ d=e[i][x];
if (d<vert[x].flux) vert[i].flux=d;
else vert[i].flux=vert[x].flux;
vert[i].stare=1; vert[i].sursa=-x;
}
vert[x].stare=2;
}
while (vert[t].stare !=1 && activ() !=0 );
// miscarea inapoi, extinderea fluxului
delta=0;
if (vert[t].stare==1 )
{ x=t;
delta=vert[t].flux;
do
{ q=abs(vert[x].sursa);
if (vert[x].sursa>0) e[q][x]=e[q][x]+delta;
if (vert[x].sursa<0) e[x][q]=e[x][q]-delta;
x=q;
}
112 | P a g e
while (x!=s);
}
int main()
{ readdata();
do
{ init_vert();
flux();
} while (delta !=0);
printf("\n%d", fluxtotal());
return 0;
}
dat
un
graf
G (V , E )
cu
surse
( ns )
stocuri
c( s, si ) c si , v j
k
j 1
c(ti , t ) c v j , ti
r
j 1
c s, si c( si , v j ) se
j 1
c(ti , t ) c v j , ti se
r
j 1
e (u, v) E
Transformarea grauluif
Pas 1. Se adaug dou vrfuri s, t iniial izolate. V V
s , t .
114 | P a g e
graful
ci , j (i 1,..., n; j 1,..., n)
G (V , E )
i
capacitile
cu
ponderile
vrfurilor
arcelor
z j ( j 1,..., n) .
e
i 1
i, j
zj
( j 1,..., n) .
, v j
Arcele
v , v
i
v , v din
i
originea n vrful v j :
v , v
j
trec n
v , v .
Un exemplu de
Univ.out
Explicaie
3
1
2
1
1
2
3
3 5
3 5
4
2 3 4 5
4
117 | P a g e
Univ.in
Univ.out
Explicaie
4 3 2
1
1
2
1
2
2
1
Rezolvare
Problema este de tip de flux maxim, care urmeaz s fie determinat pe
un graf tripartit. Prima component a grafului simbolizeaz
calculatoarele, a doua tipurile de conexiuni (porturi), iar a treia
echipamentele periferice. Calculatorul i se unete printr-un arc cu
portul j, dac dispune de un asemenea port. Portul j se unete printr-un
arc cu echipamentul k, dac echipamentul dispune de un asemenea
port. La urmtoarea etap o sursa virtual se conecteaz la grupul de
calculatoare, iar grupul de echipamente este conectat la o destinaie
virtual. Pe graful astfel obinut se lanseaz algoritmul standard de
flux maxim.
type t2=array[1..207, 1..207] of shortint;
nod=record
pr,del,st:integer;
end;
t3=array[1..207] of nod;
var e,a:^t2;
b:t3;
fmv,fm,nr,delta,s,t,k,n,m:integer;
procedure readdata;
var i,j: integer;
begin
assign(input,'universitate.in'); reset(input);
assign (output, 'universitate.out'); rewrite(output);
readln(n,m,k); nr:=n+m+k+2;
for i:=2 to n+1 do
begin
while not seekeoln do
begin
read(j);
a^[i,n+j+1]:=1; a^[1,i]:=1;
118 | P a g e
end;
readln;
end;
for i:=1 to m do
begin
while not eoln do
begin
read(j);
a^[n+1+j,n+k+1+i]:=1; a^[i+n+k+1,nr]:=1;
end;
readln;
end;
close(input);
end;
function sum(t: integer): integer;
var i,s : integer;
begin
s:=0;
for i:=1 to nr do s:=s+e^[i,t];
sum:=s;
end;
procedure init_b;
var i : integer;
begin
fillchar(b, sizeof(b),0);
for i:=1 to nr do
begin
b[i].del:= 100;
b[i].pr :=0;
end;
b[s].st:=1; b[s].pr:=+s;
end;
function activ : integer;
var i : integer;
begin
activ:=0;
for i:=nr downto 1 do if b[i].st=1 then
end;
activ:=i;
procedure ford;
var x,i,d1,q: integer;
begin {ford}
{miscarea inainte, construim lantul}
repeat
119 | P a g e
x:=activ;
{dupa G+}
for i:=1 to nr do
if (b[i].st=0) and (a^[x,i]>0) and (e^[x,i]<a^[x,i]) then
begin
d1:=a^[x,i]-e^[x,i];
if d1<b[x].del then b[i].del:=d1 else b[i].del:=b[x].del;
b[i].st:=1; b[i].pr:=+x;
end;
{dupa G-}
for i:=1 to nr do
if (b[i].st=0) and (e^[i,x]>0) then
begin
d1:=e^[i,x];
if d1<b[x].del then b[i].del:=d1 else b[i].del:=b[x].del;
b[i].st:=1; b[i].pr:=-x;
end;
b[x].st:=2;
until (b[t].st=1) or (activ=0);
{miscarea inapoi, extinderea fluxului}
delta:=0;
if b[t].st=1 then
begin
x:=t;
delta:=b[t].del;
repeat
q:=abs(b[x].pr);
if b[x].pr>0 then e^[q,x]:=e^[q,x]+delta;
if b[x].pr<0 then e^[x,q]:=e^[x,q]-delta;
x:=q;
until x=s;
end;
end; {ford}
begin
new(a); fillchar(a^, sizeof(a^), 0);
new(e); fillchar(e^, sizeof(e^), 0);
readdata;
s:=1; t:=nr; fm:=0;
repeat
init_b; ford; fmv:=fm; fm:=sum(t);
until (delta=0) or (fm-fmv=0);
writeln(m-fm);
close(output);
end.
120 | P a g e
Exerciii
1. Elaborai un program pentru separarea mulimii de vrfuri a
unei reele de transport n dou componente distincte: mulimea
de surse i mulimea de stocuri.
2. Elaborai un program pentru determinarea fluxului maxim pe
grafuri cu surse i destinaii multiple.
3. Elaborai un program pentru transformarea grafului cu restricii
aplicate pe vrfuri ntr-un graf cu restricii aplicate pe muchii.
4. Elaborai un program pentru determinarea fluxului maxim pe
grafuri cu restricii aplicate pe vrfuri.
121 | P a g e
11.1 Cuplaje
ntr-un graf neorientat G (V , E ) mulimea de muchii M se
numete cuplaj dac oricare dou muchii din M nu an vrfuri comune.
Cuplajul
Des. 11.1 Cuplaje maxime n graful (a). Cuplaj maxim pe patru muchii (1,4) (2,3)
(5,8) (6,7) (b). Cuplaj maxim pe trei muchii (1,5) (2,3) (6,8) (c)
122 | P a g e
graful
GA (VA , EA ) ,
G (V , E ) E e1 ,..., eM . Se va
unde
VA e1 ,..., eM ,
iar
EA ei , e j : u V , u ei & u e j .
Exemplu. Se consider graful G (V , E ) din figura 11.2.a. Fiecare
muchie din graful iniial se transform ntr-un vrf al grafului asociat
e , e din
i
Algoritm:
Pas 1. Se creeaz lista muchiilor din G (V , E ) . L e1 ,...em .
Pas 2. Se creeaz tabloul bidimensional E matricea de adiacen a
grafului GA .
Pas 3. Pentru toi i de la 1 la m-1.
Pentru toi j de la i+1 la m
Dac n G (V , E ) ei
e j ; ei , e j E ,
Implementare
Intrare: graful G (V , E ) , descris n tabloul bidimensional a.
124 | P a g e
G (V , E ) .
Exemplu: Program-prototip pentru generarea tuturor cuplajelor
maxime.
Intrare: graful G (V , E ) .
Ieire: toate cuplajele maxime ale grafului G (V , E ) .
#include <conio.h>
#include <stdio.h>
struct edge{int v1; int v2;} list[400];
int a[20][20],b[400][400], q[20], s[20], m=0,i,j,n,k;
FILE *f;
125 | P a g e
int asociat ()
{ int i,j;
for (i=1;i<=n;i++)
for (j=1+i; j<=n; j++)
if (a[i][j]!=0 ){m++; list[m].v1=i;list[m].v2=j;}
for (i=1;i<=m;i++)
for (j=1+i; j<=m; j++)
if (list[i].v1==list[j].v1 || list[i].v1==list[j].v2
|| list[i].v2==list[j].v1 || list[i].v2==list[j].v2
) b[i][j]=b[j][i]=1;
}
int fillc(int *x, int z, int num)
{ int i;
for (i=1;i<=num;i++) x[i]=z;
return 0;
}
int print()
{ int i;
printf("\n");
for (i=1;i<=m;i++)
if (s[i]==1) printf("(%d %d)", list[i].v1, list[i].v2);
printf("\n");
}
int mind(int *s, int *q)
{ int i,j,k=0,r, rest[20];
for (i=1;i<=m;i++) if(q[i]!=0) k=1;
if (k==0) {print();}
else { j=m;
while (s[j]==0 && j>=1) j--;
r=j+1;
for (i=r;i<=m;i++)
if (q[i]==1){ fillc(rest,0,m);
s[i]=1; q[i]=0;
for (j=1;j<=m;j++)
if (b[i][j] != 0 && q[j]==1)
{q[j]=0; rest[j]=1;}
mind (s,q);
s[i]=0;q[i]=1;
for (j=1;j<=m;j++)
if(rest[j]==1) q[j]=1;
}
126 | P a g e
}
return 0;
}
int main()
{
f=fopen("data.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
fscanf(f, "%d", &a[i][j]);
fclose(f);
asociat();
fillc(s,0,m);
fillc(q,1,m);
mind(s,q);
return 0;
}
Rezultate:
Pentru graful din desenul 11.2 (a) se
obin cuplajele:
police.out
1
Explicaii
Rezolvare
Reeaua de drumuri i intersecii reprezint un graf planar. Soluia
problemei reprezint un cuplaj maxim de putere minim (format dintrun numr minim de muchii). Prin urmare, este suficient s se
construiasc graful asociat reelei de strzi, apoi, pe graful construit s
se determine mulimea maximal independent de putere minim.
128 | P a g e
Implementare
var a:array[1..51,1..51] of shortint;
q,s: array[1..51] of shortint;
n:integer;
procedure readdata;
var f:text;
i,k: integer;
begin
assign(f,'police00.in'); reset(f);
readln(f,n);
for i:=1 to n do
begin
while not eoln(f) do
begin
read(f,k);
a[i,k]:=1;
end;
readln(f);
end;
end;
procedure print;
var i:integer;
begin
for i:=1 to n do
if s[i]=1 then write(i,' ');
writeln;
end;
procedure mind;
var i,j,k,r :integer;
rest: array[1..50] of shortint;
begin
k:=0;
for i:=1 to n do if q[i]<>0 then k:=1;
if k=0 then begin write('solutie :'); print; end
else begin
j:=n;
while (s[j]=0) and (j>=1) do dec(j);
r:=j+1;
for i:=r to n do
if (q[i]=1) then
129 | P a g e
begin
fillchar(rest, sizeof(rest),0);
s[i]:=1; q[i]:=0;
for j:=1 to n do
if (a[i,j]<>0) and (q[j]=1) then
begin
q[j]:=0; rest[j]:=1;
end;
mind;
s[i]:=0; q[i]:=1;
for j:=1 to n do
if rest[j]=1 then q[j]:=1;
end;
end;
end;
begin
readdata;
fillchar(s, sizeof(s),0);
fillchar(q, sizeof(q),1);
mind;
readln;
end.
130 | P a g e
Exerciii
Des. 11.3
131 | P a g e
15
Crater.out
3
3 4 1
12.2 Translatori16
Enun
Pentru organizarea unui simpozion internaional o companie de Relaii
Publice are nevoie s angajeze translatori din limbile native ale
participanilor n limba englez. Baza de candidai este format din N
persoane, pentru fiecare din ei fiind cunoscute limbile n care el poate
efectua traducerea. Toi translatorii beneficiaz de salarii egale. Fiind
cunoscut setul S de limbi n care urmeaz s fie efectuate traduceri, s
se determine un numr minim de translatori, care vor asigura toate
traducerile.
Intrare
Prima linie a fiierului de intrare conine numrul ntreg N numrul
de translatori (1N100). Urmtoarele N linii ale fi;ierului de intrare
conin de la 1 la 200 numere ntregi pozitive indicii limbilor n care
translatorul poate efectua traducerea. Linia i+1 a fi;ierului d eintrare
conine infoaia despre limbile n care poate efectua traducerea
translatorul i. Urmeaz o linie cu cel mult 300 numere ntregi pozitive,
separate prin spaiu indicii limbilor utilizate la simpozion.
Ieire
Fiierul de ieire va conine n prima linie numrul ntreg K numrul
de translatori necesari. Cea de a doua linie va conine indicii
translatorilor selectai, n ordine lexicografic, separai prin spaiu.
Dac exist mai multe soluii, se afieaz oricare din ele.
Exemplu
Translate.in
5
1 2 4
2 3 6
1 5 6
1 4 7
6 7
1 2 3 4 5 6 7
16
Translate.out
3
2 3 4
[6, p 63.]
133 | P a g e
17
18
[6, p 70.]
Republica Moldova, coala de var la Informatic, 2002
134 | P a g e
Ieire
Fiierul de ieire va conine pe o singur linie
culori, necesare pentru colorara hrii.
numrul minim de
Exemplu:
color.in
5
0 1 0 1 0
1 0 1 1 1
0 1 0 1 1
1 1 1 0 1
color.out
4
2
12.5 Safeuri19
Enun
ncperea securizat ce conine safeurile personale ale Bncii
Gringotts Ltd are forma unui dreptunghi cu laturile nm i este
divizat n n m platforme ptrate de dimensiunea 1 1 uniti de
lungime. Unica platform liber este cea din colul stnga sus. Ea
marcheaz ieirea din ncpere. Unele platforme sunt ocupate cu
echipamente de supraveghere, montate inamovibil, iar pe celelalte se
afl cte un safeu, dimensiunile cruia coincid cu cele ale platformei. n
unul din safeuri se pstreaz Piatra Filozofal. La cererea lui
Dumbledore, spiriduii trebuie s scoat din incpere safeul cu Piatra
Filozofal. Unicul tip de operaiii pe care le pot efectua spiriduii
const n deplasarea oricrui safeu de pe platforma pe care el se afl pe
o platform nvecinat, cu condiia c aceasta este liber. Sunt
considerate ca fiind nvecinate doar platformele ce au o latur comun.
19
Cerin
Scriei un program, care determin numrul minim de operaii necesare
pentru a scoate safeul cu Piatra Filozofal din ncperea securizat.
Intrare
Prima linie a fiierului de intrare conine numerele ntregi n i m
dimensiunile ncperii (1 n, m 50). Urmeaz n linii a cte m
simboluri fiecare. Simbolul . marcheaz poziia liber. Unica poziie
liber este intrarea n depozit. Simboul # marcheaz o platform cu
echipament de supraveghere. Platformele cu echipamente de
supraveghere nu pot fi deplasate i pe ele nu se plaseaz safeuri.
Simbolul c semnific o platform cu safeu. Simbolul X platforma
pe care se afl safeul cu Piatra Filozofal. Safeul se consider scos din
ncpere, dac el este adus pe platforma ce reprezint intrarea n
depozit. Se garanteaz, c cel puin unul dintre numerele n, m este mai
mare dect 1, iar fiecare dintre simbolurile . i X apar doar cte o
singur dat. Simbolul . este ntotdeauna amplasat n colul stng sus
al ncperii securizate.
Ieire
Dac safeul nu poate fi scos din ncperea securizat, n fiierul de
ieire se va nscrie cuvntul Impossible.
n caz contrar unica linie a fiierului va conine un singur numr
numrul minim de operaii, necesar pentru scoaterea safeului cu Piatra
Filozofal din ncperea securizat.
Exemple
Safeu.in
3 3
.#X
ccc
c#c
2 3
.cX
ccc
136 | P a g e
Safeu.out
Impossible
20
Output
4
282 141
141 282
201 100
201 1
1 1
2 3
3 2
4 4
12.7 Agenii21
Enun
Din cauza arestrii de ctre eventualul inamic a unui numr mare de
ageni ce activau n Mioritic Land, Very Intelligense Agency a hotrt
sa mbunteasc regulile de activitate a acestora. Cea mai mare
problem este asigurarea ntlnirilor sigure ale agenilor. Sigurana
urmeaz s fie asigurat pe o reea prestabilit de drumuri i pentru
anumite poziii iniiale ale agenilor. Pentru a organiza o ntlnire
sigur, agenii vor respecta urmtoarele reguli:
agenii se deplaseaz ziua, iar ntlnirile au loc seara;
agentul trebuie s-i schimbe locul de aflare n fiecare zi;
agenii circul doar dea lungul drumurilor indicate (unele din
aceste drumuri au o singur direcie de deplasare);
un agent nu poate s se deplaseze prin mai multe orae ntr-o
singur zi, (doar ntr-un ora vecin cu cel n care se afl
dimineaa);
distana ntre orice dou orae legate printr-un drum poate fi
parcurs timp de o zi (pn la venirea serii);
ntlnirea are loc doar atunci cnd ambii ageni se afl n acelai
ora n aceeai sear.
Scriei un program, care:
citete numrul de orae i descrierea reelei de drumuri din
fiierul AGE.IN;
verific dac exist posibilitatea unei ntlniri sigure i dac da
de cte zile este nevoie pentru a o organiza;
scrie rezultatul n fiierul AGE.OUT.
Intrare
Prima linie a fiierului de intrare AGE.IN, conine numerele ntregi n i
m, separate prin spaiu,l 1n250, 0mn(n-1).
Linia a doua a fiierului de intrare conine numerele ntregi a1 i a2,
separate prin spaiu, 1a1, a2n i a1a2. Numerile respective reprezint
poziiile agenilor Nr. 001 i Nr. 002.
AGE.OUT
3
12.8 Interogri22
Enun
Se consider un graf care iniial este format din P noduri izolate,
etichetate de la 1 la P. Se mai consider N intrri, unde intrare poate
nsemna:
comand o comand are forma 'I+J', cu semnificaia c n graf
se adaug muchia care unete nodurile I i J (dac I i J erau deja
unite n acel moment, nu se ntreprinde nici o aciune);
interogare o interogare este de forma 'I?J', adic se ntreab
dac n acel moment I i J sunt n aceeai component conex.
Se pleac de la un graf iniial format din noduri izolate, care pe
parcurs se unific. Pe parcurs se pun interogri dac anumite perechi
de noduri sunt sau nu n aceeai component conex.
22
Intrare / Output
Fiierul ENTRIES.IN conine pe prima linie numrul N de
intrri. Pe urmtoarele N linii se gsesc intrrile, cte una pe linie. O
intrare este codificat prin trei numere separate prin cte un spaiu.
Primele dou numere reprezint nodurile I i J (numere ntregi,
cuprinse ntre 1 i P), iar al treilea este 1 dac intrarea este o
comand, respectiv 2 dac intrarea este o interogare.
La fiecare interogare, se scrie pe o linie separat n fiierul
ENTRIES.OUT numrul 1 dac nodurile referite sunt n acel moment
n aceeai component conex, respectiv numrul 0 n caz contrar.
Restricii
1 N 5 000; 1 P 10 000 000
n lista de intrri exist cel puin o interogare
Exemplu
ENTRIES.IN
9
1
1
3
2
1
2
1
3
1
2
2
7
3
3
4
4
4
7
2
1
2
1
2
2
1
2
2
ENTRIES.OUT
0
0
1
0
1
0
Input
Fiierul de intrare conine descrierea uneia sau a mai multor galaxii.
Fiecare descriere ncepe cu o linie care conine un numr ntreg N care
specific numrul planetelor n galaxie. Urmtoarele N lini conin
descrierea fiecrei planete, care este format din:
1. Litera care corespunde planetei.
2. Spaiu.
3. Valoarea relativ a produsului exportat ctre Pmnt n
forma d.dd.
141 | P a g e
4. Spaiu.
5. Un ir de caractere i/sau caracterul '*': literele din ir indic
liniile de comer ctre aceste planete iar '*' indic acordul
planetei de a deschide o linie ThrustoZoomcte Pmnt.
Ieire
Pentru fiecare descriere a galaxiei fiierul deieire va conine o singur
linie citit ca "Import from P" unde P este litera ce corespunde planetei
cu cel mai valoros export, innd cont de pierderile cauzate de tranzit.
Dac mai multe planete pot oferi un export la fel de valoros, se va afia
indicele primei planete, n ordine lexicogafic.
Exemplu:
Input
1
F 0.81
5
E 0.01
D 0.01
C 0.01
A 1.00
B 0.01
10
S 2.23
A 9.76
K 5.88
E 7.54
M 5.01
G 7.43
I 6.09
C 8.42
O 4.55
Q 3.21
*
*A
A*
*A
EDCB
A*
Output
Import from F
Import from A
Import from A
Q*
C
MI
GC
OK
IE
KG
EA
QM
SO
12.10 Incendiator24
Enun:
Pe o reea rectangular cu distana
unitar ntre liniile vecine a fost introdus
un system de coordinate cartezian.
Originea sistemului se afl n unul din
punctele de intersecie a liniilor reelei,
axele lui sunt orientate paralel liniilor.
24
chibriturilor care se
Ieire
Fiierul de ieire va conine coordonatele punctului n care trebuie de
aprins figura pentru ca ea s ard ntr-un timp minim, apoi timpul de
ardere a figurii cu cel puin 2 semne dup virgul, separate prin spaiu.
Dac exist mai multe soluii, poate fi prezentat oricare dintre ele.
Restricii:
1 N 40;
0 T 107.
143 | P a g e
Exemple
*.in
1
0
5
0
1
0
0
2
3
1
1
1
0 1 1 1
0
0
0
0
2
0
0
1
1
1
1
1
0
1
1
1
10
1
1
1
1 1 2 10
2 2 2 10
1 2 2 50
*.out
0 0
1.00
0 0
3.25
2 2
35.00
list.in
7
1 2 2 2 1 7
list.in
10
6 2 7 9 2 9 4 4 10
list.out
1 4
2 3
3 4
4 5
list.out
3 1
1 7
2 1
4 2
5 2
6 2
list.out
8 4
7 5
3 2
9 6
9 4
10 4
1 6
2 9
2 7
145 | P a g e
Ieire
Fiierul de ieire va conine cte un numr pentru fiecare set de date
din fiierul input.
Restrictii : n 500 .
Exemplu
input
7
0:
1:
2:
3:
4:
5:
6:
3
0:
1:
2:
(3)
(2)
(0)
(0)
(2)
(1)
(2)
4 5 6
4 6
output
5
2
0 1
0
0 1
(2) 1 2
(1) 0
(1) 0
12.13 UP26
Enun:
Penru a susine cu succes testului de angajare n funcia de
programator la Compania Macrosoft, competitorul trebuie s poat
rezolva probleme din urmtoarele patru compartimente: programarea
dinamic,
Backtracking-ul,
Teoria
Grafurilor
i
Geometria
Computaional. Pregtirea cea mai bun este cea fcut n baza unui
ndrumar (culegere de probleme), editat de Compania Macrosoft.
Nivelul de pregtire al competitorului la fiecare din teme este
determinat de un indice notat prin UP, care ia valori de la 1 la L. n
procesul testrii, pentru fiecare problem e determinat valoarea
minim a indicelui UP al programatorului pentru fiecare din
compartimentele, necesare ca el s poat rezolva problema dat. Sunt
26
Ieire
4
2 1 4 3
2
3
3
5
2
2
4
1
3
5
2
3
5
1
3
5
2
4
5
1
3
5
2
5
147 | P a g e
12.14 Alchimistul27
Alchimistul Ion a descoperit Piatra Filozofal, cu ajutorul creia pot fi
realizate mai multe reacii alchimice de transformare a unor substane
n altele. Masa fiecrui reagent la nceputul reaciei i masa fiecrei din
substanele obinute n rezultatul reaciei sunt egale cu cte 1 gram. (n
alchimie legea conservrii masei poate fi nclcat).
Iniial Ion are un gram de plumb. Cu ajutorul Petrei filozofale Ion
poate transforma substana sa n alte substane, care ulterior de
asemenea pot fi prelucrate cu ajutorul Petrei filozofale. Efectund
reaciile una dup alta, Ion vrea s obin ct mai mult aur.
Scriei un program, care, avnd o descriere a reaciilor posibile, l va
ajuta pe Ion s obin ct mai mult aur.
Intrare
Prima linie a fiierului de intrare conine numrul ntreg K numrul
de substane participante la reacii (1K6).
Cea de a doua linie conine lista substanelor (aurul i plumbul sunt
prezente n toate listele). Denumirea substanelor nu depete 10
simboluri.
A treia linie conine numrul ntreg L numrul de tipuri de reacii
realizate de Piatra Filozofal (1L100).
Urmeaz L descrieri ale reaciilor. Fiecare descriere e format din dou
linii:
Prima linie substanele care intr n reacie.
Linia doi substanele rezultante.
Output
Programul va scrie n fiierul de ieire un numr cantitatea obinut
de aur, sau, n cazurile n care Ion poate obine orice cantitate de aur
textul QUANTUM SATIS
input
5
plumb aur sulf mercur cupru
5
plumb
aur sulf mercur
plumb
aur cupru mercur
mercur aur
sulf
mercur cupru
mercur sulf aur
sulf mercur
aur
output
explicaii
plumb
plumb
mercur
aur
sulf
mercur
aur
mercur
cupru
aur
mercur
cupru
sulf
sulf
mercu
r
mercur
sulf
aur
aur
28
CEOI, 2002
149 | P a g e
output
2
1 2
3 3
Explicaie
12.16 Metroul29
Metroul din Londra reprezint un sistem complex, care transport zilnic
milioane de pasageri (fig. 1). Din punctul de vedere al pasagerului,
metroul poate fi tratat ca o mulime de linii de tren i o mulime de
staii. n scopuri didactice, vom nota liniile de tren prin literele mari A,
Fig. 1
Fig. 2
151 | P a g e
Ieire
Fiierul text METROU.OUT va conine pe o singur linie numrul
minim de transbordri.
Exemplu.
METROU.IN
METROU.OUT
4
1
2
7
5
9
2
6
6
9
1 8
3 4 5
8
4
12.17 Multimicroprocesoare30
Este cunoscut faptul, c capacitatea de prelucrare a
calculatoarelor moderne poate fi mrit prin includerea n componena
acestora a mai multor microprocesoare. n astfel de calculatoare, un
microprocesor prelucreaz datele numerice, un alt microprocesor
prelucreaz informaia grafic, un al treilea procesor prelucreaz
informaia sonor .a.m.d. Pentru a face schimb de date ntre ele,
microprocesoarele sunt reunite prin conductoare.
Presupunem, c un calculator personal conine n microprocesoare,
notate prin m1, m2, ..., mn. Prin rij vom nota numrul de conductoare
r r
r 0
ij
ntre microprocesoarele mi i mj. Evident, ij
i ii
.
n interiorul calculatorului, microprocesoarele m1, m2, ..., mn pot fi
instalate n anumite poziii, notate prin p1, p2, ..., pn. Prin dkl vom nota
d kk 0
d kl d lk
p1
p2
p1
p2
microprocesoarele
p3
p3
m
poziiile
1
o posibil
variant
de instalare
153 | P a g e
Exemplu.
MULTI.IN
3
0 10 50
10 0 100
50 100 0
0 1 2
1 0 3
2 3 0
MULTI.OUT
3 2 1
230
0 r 1000 1 d 1000
ij
kl
Restricii. 3 n 9 ,
,
. Timpul de execuie
nu va depi 2,0 secunde. Programul va folosi cel mult 32 Megaoctei de
memorie operativ. Fiierul surs va avea denumirea MULTI.PAS.
Exemplul 1.
ROBOTII.IN
4 4 1 1 3
2 3
3 2
3 3
ROBOTII.OUT
6
155 | P a g e
Bibliografie
1. Sedgewick Th, Algorithms in C, 2001, Addison Wesley
2. Gibbons Alan, Algorithmic ghaph theory, 1999, Addison Wesley
3. ., , 1988, ,
4. .., ,
2001, ,
5. ., ,1981,
,
6. ., . , 1978,
,
7. Cormen Th., Leiserson Ch., Rivest R., Introducere n algoritmi.
Agora, Cluj, 2001.
8. Cristian A.Giumale, Introducere n analiza algoritmilor. Teorie i
aplicaie. Polirom, Iai, 2004
9. Ptru Bogdan. Programarea calculatoarelor. Teora, Bucureti,
1998.
10. Cerchez Em., erban M. Programarea n limbajul C/C++ pentru
liceu. Vol III. Teoria Grafurilor. Polirom, Iai, 2006.
11. ., ., .
. , , 1985
156 | P a g e
157 | P a g e
Abrevieri i notaii
A B
- din A rezult B.
A B
- A este echivalent cu B
x X, x X
- x aparine X (x nu aparine X)
x X : Q
A B
( X )
- cardinalul mulimii X
a1 ,..., an
(a, b)
- pereche ordonat
A B
a b
- valoarea elementului
- valoarea elementului
i este incrementat cu 1.
- valoarea elementului
i este decrementat cu 1.
- valorile elementelor
(a b) (b a)
158 | P a g e
a i b sunt interschimbate