Sunteți pe pagina 1din 38

Cursul 8

Teoria Grafurilor. Introducere

noiembrie 2020

Cursul 8
Teoria Grafurilor
Cuprins

Graf = structură de date pentru modelarea relaţiilor binare dintre


componentele unui sistem.
G = (V , E ) unde
V : mulţime de noduri = componentele sistemului
E : listă de muchii = legături/relaţii dintre noduri
Tipuri de grafuri:
b c V = {a, b, c, d, e}
e E = [a−b, b−c, b−c, e−c,
I Neorientate:
a d e−e, d−e, d−a, c−a]
b c V = {a, b, c, d, e}
eE = [a→b, b→c, c→b, e→c,
I Orientate:
a d e→e, e→d, d→a, c→a]
Muchiile orientate se numesc si arce (singular: arc).
Observaţie: Dacă a 6= b atunci:
În grafuri neorientate: a−b = b−a (orientarea nu contează)
În grafuri orientate: a→b 6= b→a (orientarea contează!)
Cursul 8
Vocabularul teoriei grafurilor
Terminologie

Orice muchie este incidentă la 2 noduri (capetele muchiei).


Un arc a→b are sursa a şi destinaţia b.
Muchiile de forma a−a sau a→a se numesc bucle.
Apariţiile multiple ale unei muchii ı̂n E se numesc muchii
paralele. Exemplu: b−c ı̂n
E = [a−b, b−c, b−c, e−c, e−e, d−e, d−a, c−a]
Un graf orientat se numeşte şi digraf (engl. directed graph).
Un pseudograf este un graf cu bucle şi muchii paralele.
Un multigraf este un graf fără bucle şi cu muchii paralele.
Un graf simplu este un graf fără bucle şi fără muchii paralele.
⇒ dacă G = (V , E ) este graf simplu atunci E ⊆ V × V şi scriem
a→b ı̂n loc de ha, bi ∈ E .
⇒ cel mai adesea, vom studia grafuri simple.

Cursul 8
Grafuri ponderate

Graf ponderat (G , w ) unde


G = (V , E ) este un graf
w :E →R
unde w (e) este ponderea sau greutatea muchiei e ∈ E .
Dacă G este graf simplu iar e = x−y sau e = x→y , atunci scriem
w (x, y ) ı̂n loc de w (e).
Exemplu
2
9
b c w (a, b) = 3, w (a, e) = 4, w (b, c) = 2
12
3

a 5 1 f w (c, b) = 9, w (c, f ) = 12, w (c, e) = 1


4
7

e 1 w (e, b) = 5, w (e, d) = 1, w (d, f ) = 7


d

Cursul 8
Vocabularul teoriei grafurilor
Ordinul unui graf = numărul de noduri
Mărimea unui graf = numărul de muchii
Mulţimea de vecini a unui nod x ∈ V :
V (x) = {y | x−y ∈ E } dacă graful este neorientat
V (x) = {y | x→y ∈ E } dacă graful este orientat
S
Dacă S ⊆ V atunci V (S) = x∈S V (x).
V [x] = V (x) ∪ {x}
x este nod terminal dacă are un singur vecin: |V (x)| = 1
x este nod izolat dacă nu are vecini: |V (x)| = 0
Dacă G este graf neorientat:
gradul lui x este deg(x) = |{y | x−y ∈ E }| + |{y | y −x ∈ E }|
secvenţa de grade a lui G este lista gradelor nodurilor din G , ı̂n
ordine descrescătoare.
Dacă G este digraf:
gradul interior al lui x este deg− (x) = |{y | y →x ∈ E }|
gradul exterior al lui x este deg+ (x) = |{y | x→y ∈ E }|
Cursul 8
Vocabularul teoriei grafurilor
Exemplu

1 6 3 Mărimea: 6
5 2 4 Ordinul: 6

v V (v ) V [v ] deg(v )
1 {1, 2, 5} {1, 2, 5} 4
2 {1, 3, 4} {1, 2, 3, 4} 3
3 {2, 4} {2, 3, 4} 2
4 {2, 3} {2, 3, 4} 2
5 {1} {1, 5} 1
6 ∅ {6} 0

Secvenţa de grade este [4, 3, 2, 2, 1, 0].


Nodul 5 este terminal. Nodul 6 este izolat.

Cursul 8
Vocabularul teoriei grafurilor
Exemplu

1 6 3 Mărimea: 6
5 2 4 Ordinul: 7

v V (v ) V [v ] deg− (v ) deg+ (v ) deg(v )


1 {1, 2, 5} {1, 2, 5} 2 2 4
2 {1, 3, 4, 5} {1, 2, 3, 4, 5} 3 2 5
3 {2, 4} {2, 3, 4} 1 1 2
4 {2, 3} {2, 3, 4} 0 1 1
5 {1, 3} {1, 3, 5} 1 1 2
6 ∅ {6} 0 0 0

Secvenţa de grade este lista [5, 4, 2, 2, 1, 0].

Cursul 8
Grafuri izomorfe

Grafurile simple G = (V , E ) şi H = (V 0 , E 0 ) sunt izomorfe, şi scriem


G ' H, dacă există o funcţie bijectivă f : V → V 0 astfel ı̂ncât
x−y ∈ E dacă şi numai dacă f (x)−f (y ) ∈ E 0
x→y ∈ E dacă şi numai dacă f (x)→f (y ) ∈ E 0
Remarcă. Două grafuri sunt izomorfe dacă putem redenumi nodurile
primului graf cu numele nodurilor celui de-al doilea graf ı̂n aşa fel ı̂ncât
muchiile dintre noduri să rămână aceleaşi.
De exemplu G ' H unde
1 5 a h

6 2 g b
G: H:
8 4 c n

3 7 i d

Cursul 8
Vocabularul teoriei grafurilor
Conectivitate (1)

Dacă G = (V , E ) este graf neorientat atunci


Un drum sau cale de la x la y ı̂n G este o listă de noduri
π = [x1 , x2 , . . . , xn ] astfel ı̂ncât n ≥ 2, x1 = x, xn = y şi
xi −xi+1 ∈ E pentru 1 ≤ i < n.
Lungimea drumului este n − 1.
Dacă G = (V , E ) este graf orientat atunci
Un drum sau cale de la x la y ı̂n G este o listă de noduri
π = [x1 , x2 , . . . , xn ] astfel ı̂ncât n ≥ 2, x1 = x, xn = y şi
xi →xi+1 ∈ E pentru 1 ≤ i < n.
Lungimea drumului este n − 1.

Cursul 8
Vocabularul teoriei grafurilor
Conectivitate (2)

Scriem x y dacă există drum de la x la y , şi


π
x y dacă π este un drum de la x la y .
Un drum este
elementar dacă nu conţine de mai multe ori acelaşi nod,
hamiltonian dacă este elementar şi conţine toate nodurile
grafului.
simplu dacă nu conţine de mai multe ori aceeaşi muchie,
eulerian dacă este simplu şi conţine toate muchiile
grafului.
Un ciclu este un drum simplu de la un nod x la x.
Un ciclu [x1 , . . . , xn , x1 ] este
hamiltonian dacă [x1 , . . . , xn ] este drum eulerian.
eulerian dacă este drum eulerian.

Cursul 8
Vocabularul teoriei grafurilor
Conectivitate

1 3

5 2 4
[5, 1, 2, 3, 4, 2] este un drum simplu dar neelementar de lungime 5.
[5, 1, 2, 4] şi [5, 1, 2, 3] sunt drumuri elementare de lungime 3.
[2, 1, 5, 2, 3, 4, 2] este un ciclu neelementar de lungime 6.
[2, 3, 4, 2] este un ciclu elementar de lungime 3.
[1, 2, 5, 1, 4, 3, 2, 4] este un drum eulerian.
[2, 5, 1, 4, 3, 2] este un ciclu hamiltonian.

Cursul 8
Vocabularul teoriei grafurilor
Conectivitate

1 3

5 2 4
[5, 1, 2, 3, 4, 2] este un drum simplu dar neelementar de lungime 5.
[5, 1, 2, 4] şi [5, 1, 2, 3] sunt drumuri elementare de lungime 3.
[2, 1, 5, 2, 3, 4, 2] este un ciclu neelementar de lungime 6.
[2, 3, 4, 2] este un ciclu elementar de lungime 3.
[1, 2, 5, 1, 4, 3, 2, 4] este un drum eulerian.
[2, 5, 1, 4, 3, 2] este un ciclu hamiltonian.
1 2
3 are
4 5
drumul hamiltonian [3, 1, 2, 5, 4] şi
ciclul eulerian [5, 4, 5, 1, 3, 1, 2, 5].

Cursul 8
Vocabularul teoriei grafurilor
Componente conexe

Componentele conexe sunt definite pentru grafuri neorientate


G = (V , E ).
Relaţia de conectivitate “ ” este o relaţie de echivalenţă
clasele de echivalenţă ale lui se numesc componente conexe ale
lui G .
Exemplu.
1 7
2 3
4 9

5 6 8
are 3 componente conexe: {1, 2, 3, 4, 5}, {6, 8, 9} şi {7}.

Cursul 8
Vocabularul teoriei grafurilor
Componente tare conexe

Componentele tare conexe, sau tari, sunt definite pentru grafuri


neorientate G = (V , E ).
Conectivitatea tare

x ∼ct y :⇔ x y şi y x

este o relaţie de echivalenţă. Clasele de echivalenţă ale lui ∼ct se


numesc componente tari ale lui G .
G este tare conex dacă are o singură componentă tare, adică dacă
oricare două noduri din V sunt conectate tare.
Exemplu.
1 7
2 3
4 9

5 6 8
are 3 componente tari: {1, 2, 3, 4, 5}, {6, 8, 9} şi {7}.
Cursul 8
Teoreme fundamentale ale Teoriei Grafurilor

Teorema 1. Într-un graf, suma gradelor nodurilor este egală cu


dublul numărului de muchii.
X
deg(x) = 2 · |E (G )|.
x∈V (G )

Teorema 2. Orice drum de la x la y conţine un drum elementar


de la x la y .
Schiţă de demonstraţie:

Cursul 8
Clase de grafuri
Grafuri complete (Kn ), grafuri nule (En )

Graful complet Kn (n ≥ 1) are V = {1, 2, . . . , n} şi


E = {i−j | 1 ≤ i < j ≤ n}.

K1 K2 K3 K4 K5
Graful nul En (n ≥ 1) are V = {1, 2, . . . , n} şi E = ∅.

E1 E2 E3 E4 E5

Cursul 8
Clase de grafuri
Grafuri ciclice (Cn ), grafuri bipartite complete (Km,n )

Graful ciclic Cn (n ≥ 1) are V = {1, 2, . . . , n} şi


E = {i−j | 1 ≤ i ≤ n, j = 1 + (i mod n)}.

C1 C2 C3 C4 C5 C6
Pentru m, n > 0, graful bipartit complet Km,n are
V = {xi | 1 ≤ i ≤ m} ∪ {yj | 1 ≤ j ≤ n} şi
E = {xi −yj | 1 ≤ i ≤ m, 1 ≤ j ≤ n}

Cursul 8
Clase de grafuri
Căi şi arbori

Calea Pn este graful cu V = {1, 2, . . . , n} şi


E = {i−j | 1 ≤ i < n, j = i + 1}.

1 2 n−1 n

Un arbore de ordinul n este un graf simplu conex cu n noduri şi fără


cicluri. Mulţimea acestor arbori se notează cu Tn .
Remarcă. Toţi arborii din Tn au n noduri şi n − 1 muchii.
Exemplu. Arbori din clasa T5 :

G1 : G2 : G3 :

Cursul 8
Subgraf, subgraf parţial
Fie G = (V , E ) un graf şi S ⊆ V .
Subgraful indus de S ı̂n G este graful G 0 = (S, E 0 ) unde
E 0 = {e ∈ E |capetele lui e sunt ı̂n S}.
G 0 este subgraf al lui G dacă G 0 = G [S] pentru un S ⊆ V . În acest
caz, mai spunem şi că G 0 este conţinut ı̂n G .
G 0 = (V 0 , E 0 ) este subgraf parţial al lui G dacă V 0 ⊆ V şi E 0 ⊆ E .

Cursul 8
Subgraf, subgraf parţial
Fie G = (V , E ) un graf şi S ⊆ V .
Subgraful indus de S ı̂n G este graful G 0 = (S, E 0 ) unde
E 0 = {e ∈ E |capetele lui e sunt ı̂n S}.
G 0 este subgraf al lui G dacă G 0 = G [S] pentru un S ⊆ V . În acest
caz, mai spunem şi că G 0 este conţinut ı̂n G .
G 0 = (V 0 , E 0 ) este subgraf parţial al lui G dacă V 0 ⊆ V şi E 0 ⊆ E .
v x
u y
Exemplu. Fie G graful s
t
w z
v x
u y
Subgraf: s
t
v x
u y
Subgraf parţial: s
t
Cursul 8
Vocabularul teoriei grafurilor
Clică, subdiviziune

O n-clică (sau doar clică) a unui graf neorientat G este un subgraf


al lui G izomorf cu Kn . De exemplu:
• • •
• • • • • •

• • • • • •
G2 G3 G4

O subdiviziune a unui graf neorientat G este un graf obţinut prin


una sau mai multe inserări succesive de noduri noi pe muchiile lui
G . De exemplu:

este subdiviziune a lui K2,2 .

nu este subdiviziune a lui K2,2 .

Cursul 8
Operaţii cu grafuri
Fie G = (V , E ) un graf, x ∈ V , S ⊆ V şi T ⊆ E .
G − S este subgraful indus G [V − S]
G − T este subgraful parţial (V , E − T )
G \ S este graful (V 0 , E 0 ) obţinut din contracţia nodurilor din S ı̂n
un singur nod nou xS :
V 0 = (V − S) ∪ {xS }
Dacă G este neorientat atunci
E 0 ={x−y | x, y ∈ V − S şi x−y ∈ E }∪
{x−xS | există x−y ∈ E cu x ∈ V − S şi y ∈ S}.
Dacă G este digraf atunci
E 0 ={x→y | x, y ∈ V (G ) − S şi x→y ∈ E }∪
{x→xS | există x→y ∈ E cu x ∈ V − S şi y ∈ S}∪
{xS →y | există x→y ∈ E cu x ∈ S şi y ∈ V − S}.
G \ e este graful G \ S unde S sunt capetele muchiei e.
Cursul 8
Operaţii cu grafuri
Exemple

1 7
1 2 G2 : 2 3
G1 : 3 4 9
4 5
5 6 8
2 1 2 x{1,5} 2
3 3 3
4 4 5 4
G1 − {1, 5} G1 − (1−5) G1 \ {1, 5} = G1 − (1−5)
1 7 1 7 7
3 2 3
4 9 4 9 x{1,2,3,4,5} 9

5 6 8 5 6 8 6 8
G2 − {2} G2 − {2→3, 6→3} G2 \{1, 2, 3, 4, 5}

Cursul 8
Vocabularul teoriei grafurilor
δ(G ), ∆(G ), α(G ), ω(G )

Fie G = (V , E ) un graf neorientat şi S ⊆ V .


Gradul minim al lui G este δ(G ) = min{deg(x) | x ∈ V }
Gradul maxim al lui G este ∆(G ) = max{deg(x) | x ∈ V }
Mulţimea de noduri S este stabilă sau independentă dacă nu
există nici o muchie ı̂ntre noduri din S.
Numărul de independenţă al lui G este α(G ) = max{|S| | S
este mulţime independentă ı̂n G }.
Numărul de clică ω(G ) al lui G este ordinul maxim al unei
clici din G , adică ω(G ) = max{n | H este n-clică a lui G }.

Cursul 8
Vocabularul teoriei grafurilor

Exemple
b 1 5
c y 2
z
G1 : x a G2 : 4
s
d t 3 7
6
e
δ(G1 ) = ∆(G1 ) = 3, α(G1 ) = 4, ω(G1 ) = 2.
δ(G2 ) = 2, ∆(G2 ) = 6, α(G2 ) = 3, ω(G2 ) = 4.

Cursul 8
Vocabularul teoriei grafurilor
Articulaţii şi punţi

Fie G = (V , E ) un graf neorientat conex.


x ∈ V (G ) este nod de articulaţie (engl. cut vertex) dacă
G − {x} nu este conex. Altfel spus, ştergerea lui x distruge
conectivitatea lui G .
e ∈ E (G ) este o punte (engl. bridge) dacă G − e nu este
conex. Altfel spus, ştergerea muchiei e distruge conectivitatea
lui G .
S ( V (G ) este o mulţime de articulaţie (engl. vertex cut set)
a lui G dacă graful G − S nu este conex. Altfel spus,
ştergerea nodurilor din S distruge conectivitatea lui G .

Cursul 8
Vocabularul teoriei grafurilor
grad de conectivitate, distanţă, excentricitate, centru, periferie, rază, diametru

Gradul de conectivitate κ(G ) al unui graf incomplet G este numărul


minim de noduri ce trebuie eliminate din G pentru a-l deconecta,
adică κ(G ) = min{|S| | S este mulţime de articulaţie a lui G }.
Dacă k este un ı̂ntreg strict pozitiv, spunem că G este k-conex dacă
k ≤ κ(G ).
Distanţa d(x, y ) de la x la y este cea mai mică lungime a unui
drum de la x la y .
Excentricitatea e(x) a nodului x este distanţa cea mai mare de la x
la un nod ı̂n G , adică e(x) = max{d(x, y ) | y ∈ V }.
Centrul lui G este mulţimea nodurilor cu excentricitate minimă.
Periferia lui G este mulţimea nodurilor cu excentricitate maximă.
Raza lui G este excentricitatea unui nod din centrul lui G , adică
radius(G ) = min{e(x) | x ∈ V }.
Diametrul lui G este excentricitatea unui nod de la periferia lui G ,
adică diam(G ) = max{e(x) | x ∈ V }.
Cursul 8
Vocabularul teoriei grafurilor
Exemple

a b c
1 g
G1 : d e
f h
are 3 puncte de articulaţie (cele ı̂ncercuite) şi 2 punţi (cele
ı̂ngroşate).
a b c
2 g
G2 : d e
f h
nu are puncte de articulaţie şi nici punţi, dar are mulţimi de
articulaţie cu 2 noduri, de exemplu {c, e}, {f, g} sau {b, e}.
Deci κ(G2 ) = 2.

Cursul 8
Vocabularul teoriei grafurilor
Exemple

x
v
G: r a s c u z
e

d(x, c) = 2, d(r, z) = 4,
e(x) = e(e) = 2,
e(z) = e(z) = 4,
radius(G ) = 2,
diam(G ) = 4,
G are centrul {x, e},
G are periferia {r, z}.

Cursul 8
Reprezentarea grafurilor pe calculator

1 Listă de noduri + listă de muchii


2 Liste de adiacenţă
3 Matrice de adiacenţă
4 Matrice de incidenţă
5 Matrice de ponderi

Cursul 8
Reprezentarea grafurilor
1. Cu listă de noduri + listă de muchii

Exemplu
b c Listă de noduri V = [a, b, c, d, e]
Listă de muchii E = [a−b, a−c, a−d, b−c, c−e, d−e]
e Observaţii: a−b = b−a, a−c = c−a, etc.
a muchia a−b ↔ mulţimea {a, b}
d
b c Listă de noduri V = [a, b, c, d, e]
Listă de arce E = [a→b, c→a, c→b, d→a, e→c, e→d]
e Observaţii: a→b 6= b→a, a→c 6= c→a, etc.
a arcul a→b ↔ perechea ha, bi
d

Remarcă
Dacă nu există noduri izolate, nu este necesar să fie reţinută lista
de noduri V :
I V se poate calcula din E

Cursul 8
Reprezentarea grafurilor
2. Cu liste de adiacenţă

Pentru fiecare nod u ∈ V se reţine lista de vecini a lui u.


Exemplu
b c adj[a] = [b, c, d] adj[d] = [a, e]
adj[b] = [a, c] adj[e] = [c, d]
e adj[c] = [a, b, e]
a d
b c adj[a] = [b] adj[d] = [a]
adj[b] = [] adj[e] = [c, d]
e adj[c] = [a, b]
a d

Cursul 8
Reprezentarea grafurilor
3. Cu matrice de adiacenţă

Presupunem că G = (V , E ) este un graf cu n noduri.


1 Fixăm o enumerare [x1 , x2 , . . . , xn ] a nodurilor din V .
2 Matricea de adiacenţă este AG = (aij ) de dimensiune n × n cu
aij := numărul de muchii de la nodul xi la nodul xj .

Observaţii
1 Înainte de a construi AG din G , trebuie fixată o enumerare a
tuturor nodurilor: [x1 , x2 , . . . , xn ]
2 Dacă G este neorientat, AG este matrice simetrică
3 Dacă G este graf simplu, AG conţine doar 0 şi 1

Cursul 8
Reprezentarea grafurilor cu matrice de adiacenţă
Exemple

Enumerarea nodurilor: [a, b, c, d, e]


b c
0 1 1 1 0
 
G: e 1 0 1 0 0
a d AG = 1

1
1 0 0 1

0 0 0 1
0 0 1 1 0

Enumerarea nodurilor: [a, b, c, d, e]


b c
0 1 0 0 0
 
G: e 0 0 0 0 0
a d AG = 1

1
1 0 0 0

0 0 0 0
0 0 1 1 0

Cursul 8
Reprezentarea digrafurilor
4. Cu matrice de incidenţă

Presupunem că G = (V , E ) este digraf.


1 Fixăm o enumerare V = [v1 , . . . , vn ] a nodurilor din V
2 Fixăm o enumerare E = [e1 , . . . , ep ] a muchiilor din E
 de incidenţă MG = (mij ) are dimensiunea n × p şi
Matricea
 1 dacă ej are sursa vi
mij = −1 dacă ej are destinaţia vi
0 ı̂n toate celelalte cazuri.

Exemplu
Dacă V = [a, b, c, d, e], E = [e1 , e2 , e3 , e4 , e5 , e6 , e7 , e8 ] şi
−1
1 0 0 1 0 0 1
 b
e2
−1 1 0 0 0 −1 0 0 e1
MG =  0 −1 −1 ⇒ e4
1 1 0 0 0 

a c

e6
e5
0 0 −1 0 0 0 −1 −1 e8

e3
0 0 0 0 0 1 1 0
e e7 d

Cursul 8
Reprezentarea grafurilor simple ponderate
5. Cu matrice de ponderi

Presupunem că G = ((V , E ), w ) este un graf simplu ponderat.


Fixăm o enumerare [x1 , x2 , . . . , xn ] a nodurilor din V .
Matricea de ponderi WG = (wij ) a lui (G , w ) este matricea de
dimensiune n × n cu

 0 dacă i = j,
wij = w (xi , xj ) dacă xi −xj ∈ E sau xi →xj ∈ E ,
+∞ ı̂n celelalte cazuri.

Exemplu (Digraf ponderat cu enumerare de noduri [a, b, c, d, e, f ])


2
9 0 3 ∞ ∞ 4 ∞
b c
3 ∞ 0 2 ∞ ∞ ∞
12

∞ 9 0 ∞ 1 12
G :a 5 1 f ⇒ WG =  
4 ∞ ∞ ∞ 0 ∞ 7
7

1 ∞ 5 ∞ 1 0 ∞
e d ∞ ∞ ∞ ∞ ∞ 0

Cursul 8
Reprezentarea grafurilor
Studiu comparativ pentru un graf cu n noduri şi m muchii

I Reprezentarea cu listă de muchii


Adecvată pentru reprezentarea grafurilor simple fără noduri
izolate, cu m  n2
Complexitate spaţială (memorie ocupată): O(m)
I Reprezentarea cu liste de adiacenţă
Permite enumerarea rapidă a vecinilor unui nod
Complexitate spaţială (memorie ocupată): O(n + m)
I Reprezentarea cu matrice de adiacenţă AG = (aij ) sau cu
matrice de ponderi WG = (wij )
Test rapid de conectivitate directă ı̂ntre 2 noduri: O(1)
@(vi , vj ) ∈ E dacă aij = 0 sau dacă wij = ∞
Complexitate spaţială (memorie ocupată): O(n2 )
- reprezentare neadecvată când m  n2
Reprezentarea cu matrice de incidenţă MG
I Complexitate temporală: O(n · m)

Cursul 8
Un Java API pentru lucrul cu grafuri

Pentru familiarizarea cu algoritmii fundamentali de lucru cu grafuri,


vom folosi biblioteca de clase java algs4.jar.
Detalii despre ce oferă această bibliotecă găsiţi aici.
Sugestii de instalare şi utilizare pe laptop-ul personal:
Instalaţi/actualizaţi Eclipse IDE for Java Developers de aici
Descărcaţi algs4.jar de aici.
Creaţi un proiect Java EduGraph.
Creaţi package-ul ro.uvt.cs.graphs ı̂n cadrul proiectului
EduGraph.
Adăugati biblioteca externă algs4.jar:
Properties→Java Build Path→Libraries→Add External JARs

Cursul 8

S-ar putea să vă placă și