1 / 42

Thuật toán trên đồ thị

Thuật toán trên đồ thị. Một số khái niệm. Đồ thị: G = {V, E}, trong đó  V  = n, n>0, và E VV, V – tập đỉnh, E – tập cạnh và E  = m, m 0 . Nếu (a,b) E mà suy ra (b,a) E và (b,a) = (a,b) thì G – vô hướng. Ngược lại, G – có hướng. Nếu e=(a,b) E thì a gọi là liền k ề với b

sondra
Download Presentation

Thuật toán trên đồ thị

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Thuật toán trên đồ thị

  2. Một số khái niệm Đồ thị: G = {V, E}, trong đó V= n, n>0, và E VV, V – tập đỉnh, E– tập cạnh và E= m, m0. Nếu (a,b)E mà suy ra (b,a) E và (b,a) = (a,b) thì G – vô hướng. Ngược lại, G – có hướng. Nếu e=(a,b)E thì a gọi là liền kề với b và e liên thuộc với a và b. Ký hiệu V= { u1, u2, ..., un} Dao Thanh Tinh

  3. Một số khái niệm (2) Cho đồ thị: G = {V, E}, Dãy (uo,uk) = <uo, u1, ..., um>, với (ui,ui+1)  E, i = 0,...,k-1 và ui  V, i = 0,...,k được gọi là đường đi từ uo tới uk. Số cạnh có trên (uo,uk) được gọi là độ dài của đường đi (trong định nghĩa trên là m). Dao Thanh Tinh

  4. Một số khái niệm (3) Đồ thị: G = {V, E}, Cho ánh xạ f: E R+, với eE, f(e) – trọng số cạnh e. Đồ thị G = {V,E,f} gọi là có trọng số Xét đường đi (uo,uk) = <uo, u1, ..., um>, Đại lượng ((uo,uk)) = f(ui,ui+1)i = 0,...,k-1 được gọi là độ dài đường đi từ uo tới uk. Dao Thanh Tinh

  5. Một số khái niệm (4) Đồ thị: G = {V, E}, Đường kính của đồ thị là độ dài lớn nhất đường đi giữa các cặp đỉnh. Đồ thị G gọi là liên thông nếu giữa hai đỉnh bất kỳ có đường đi. Đường đi (uo,uk) = <uo, u1, ..., um> gọi là kín nếu uo=uk. Dao Thanh Tinh

  6. Một số khái niệm (5) Đồ thị: G = {V, E}, Đường đi (uo,uk) = <uo, u1, ..., um> gọi là đơn nếu mỗi cạnh có mặt trên đường đi không quá 1 lần. Đường đi kín và đơn gọi là chu trình. Dao Thanh Tinh

  7. Một số khái niệm (6) Đồ thị G = {V, E} liên thông, không có chu trình gọi là cây. Trong cây T = {V,E} nếu có một đỉnh đặc biệt được gọi là gốc thì cây được gọi là có thứ tự. Dao Thanh Tinh

  8. Duyệt đồ thị Đồ thị G = {V, E} liên thông Depth-First Search for all xV visited(x):= false; i:=0; DFS(v); output p[1..n]; Procedure DFS (v: đỉnh) • visited(v):= true; • i:=i+1; p[i] := v; • for each w liền kề của v If (visited(w)= false); DFS(w); Thời gian tính toán O(|V|+|E|) Dao Thanh Tinh

  9. Duyệt đồ thị (2) Đồ thị G = {V, E} liên thông Breadth-First Search MakeNil(Q); for all xV visited(x):= false; i:=1; visited(v):= true; p[i] := v; enqueue(v,Q); while (QNIL) a) u:=front(Q);dequeue(Q); b) for each x liền kề của v If (visited(x)= false); enqueue(x,Q); visited(x):=true; inc(i); p[i]=x; output p[1..n]; Thời gian tính toán O(|V|+|E|) Dao Thanh Tinh

  10. Single-Source Shortest Paths Cho G={V,E} liên thông, f: ER+ và u, v V. Ký hiệu (u,v) = {(u,v)} Tìm *(u,v) (*(u,v)) = min {((u,v)) : (u,v)  (u,v)} The Implementation of Dijkstra’s Algorithm Với xV ký hiệu L(x) – độ dài đường đi ngắn nhất *(u,x); Giá trị khởi tạo L(u) = 0; L(x) = + với xV\{u} Ký hiệu tập S: nếu xS thì L(x) = (*(u,x)) V+(x) = {y V : (x,y) E} V-(x) = {y V : (y,x)  E} Dao Thanh Tinh

  11. Single-Source Shortest Paths(2) The Implementation of Dijkstra’s Algorithm L(u) = 0; for all xV\{u} do L(x) = + while (S(v) = false) • L(a) = min {L(x): xV \ S; S(a)=true; • for all x (V\S) V+(a) if L(a)+ f(a,x)<L(x) then L(x):=L(a)+f(a,x); k := 0; pk := v; while (pku) • Tìm y V-(pk) sao cho L(y) + f(y,pk) = L(pk) • pk+1 = x; • k++; Output p[k..0], L(v); Running time O(|V||E|) Dao Thanh Tinh

  12. Single-Source Shortest Paths(3) Dao Thanh Tinh

  13. Single-Source Shortest Paths(4) Chứng minh thuật toán • t  S, L(t) = (*(u,t)). Khi k = 0 có 1 đỉnh t = u ! • L(a) = min {L(t): t  V\S} L(a)= (*(u,a)) và *(u,a) chỉ chứa các đỉnh (không kể a) thuộc S.Giả thiết đúng khi k=0. Giả sử Lk(a) > (*(u,a)). Đặt  = L(a). Kí hiệu t là đỉnh ngay trước a trên *(u,a): L(t) + f(t,a)= (*(u,a)) hay Lk(t) < (*(u,a)) < Lk(a) Nếu tS thì do L(t) + f(t,a)= (*(u,a)) < . Đặt L(a)=L(t)+f(t,a)< . Nghĩa là giảm được L(a). Vô lý! Nếu t S,theo thuật toánLk(a) < Lk(t) <  = L(a). Mâu thuẫn. Nghĩa là (*(u,a)) = Lk(a) Dao Thanh Tinh+

  14. Single-Source Shortest Paths(5) Floyd Shortest-Path Kí hiệu V={1, 2, ..., n} for x=1 to n for y=1 to n if ((x,y) E) D(x,y) = f(x,y) else D(x,y) = + for k=1 to n for x=1 to n for y=1 to n D(x,y) = min{D(x,y), D(x,k)+D(k,y)} Xác định đường đi: tương tự Dijsktra Running time O(|V|3) Dao Thanh Tinh

  15. Single-Source Shortest Paths (6) Cho G={V,E} liên thông, không trọng số (f:E{1}) và u, v V. Ký hiệu (u,v) = {(u,v)}. Độ dài đường đi tính bằng số cạnh tham gia. Tìm *(u,v) (*(u,v)) = min {((u,v)) : (u,v)  (u,v)} Với xV ký hiệu L(x) – độ dài đường đi ngắn nhất *(u,x); Giá trị khởi tạo L(u) = 0; L(x) = + với xV\{u} Ký hiệu tập Am = { xV: L(x) = m} V+(x) = {y V : (x,y) E} V-(x) = {y V : (y,x)  E} Dao Thanh Tinh

  16. Single-Source Shortest Paths(7) The Implementation of Algorithm m=0; L(u) = m; Am={u}; for all xV\{u} do L(x) = + while (L(v) = +) • Am+1 ={ }; • for all x Am for all y  V+(x) if (L(y) = +) then L(y):= m+1; Am+1 = Am+1  {y}; pm := v; po := u; for k:= m-1 downto 1 • Tìm y V-(pk+1)  Ak; • pk = y; Output p[0..m], L(v)=m; Running time O(|V||E|) Dao Thanh Tinh

  17. Minimum Spanning Tree Cho G={V,E}. T={V,E*}, E* E, liên thông, không có chu trình gọi là cây khung của G Remark: • Đồ thị vô hướng là cây   u,v V, (u,v) là đường đi đơn • Đồ thị G có cây khung  G liên thông Kí hiệu (G) là tập các cây khung của G. Bài toán 1. Cho G liên thông. Tìm T(G). Bài toán 2. Cho G có trọng số và T(G). Kí hiệu (T) là tổng trọng số các cạnh thuộc T. Tìm T*(G) sao cho (T*) = min {(T) : T(G)} T* - minimum spanning tree của G. Dao Thanh Tinh

  18. Minimum Spanning Tree (2) Bài toán 1. Cho G liên thông. Tìm T(G). void DFS(u: đỉnh); checked[u] = true; for each x V(u) if checked(x)=false {T:= T(u,x); DFS (x);} void BFS( a: đỉnh); enqueue (a, Q); checked[ a] = true; while ! empty(Q) u = front(Q); dequeue(Q); for each x V(u) if checked(x) = false { T:=T  (u, x); enqueue(x Q); checked(x)=true; } for all x  V checked(x) = false; DFS(v); for all x  V checked(x) = false; mkenull(Q); BFS(v); O(|V||E|) 2014-08-31 Dao Thanh Tinh 18

  19. Minimum Spanning Tree (3) Bài toán 2. Cho G có trọng số và T(G). Kí hiệu (T) là tổng trọng số các cạnh thuộc T. Tìm T*(G) sao cho (T*) = min {(T) : T(G)} T* - minimum spanning tree của G. • Thuật toán PRIME • 1. T:= { e E, f(e) - min}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a) liên thuộc với một đỉnh của T; • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T  { e}; • 3. Output T, (T); • Thuật toán KRUSKAL • 1. T:= {}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a); • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T  { e}; • 3. Output T, (T); O(m+nlgn) 2014-08-31 Dao Thanh Tinh 19

  20. Minimum Spanning Tree (4) • Thuật toán KRUSKAL • 1. T:= {}; • 2. While Số cạnh(T)<n-1 do • Chọn e là cạnh • a); • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T  { e}; • 3. Output T, (T); • Thuật toán PRIME • 1. T:= { e E, f(e) - min}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a) liên thuộc với một đỉnh của T; • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T  { e}; • 3. Output T, (T); 2014-08-31 Dao Thanh Tinh 20

  21. Minimum Spanning Tree (5) • Thuật toán PRIME • 1. T:= { e E, f(e) - min}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a) liên thuộc với một đỉnh của T; • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T  { e}; • 3. Output T, (T); Xét cấu trúc: V={1, 2, ...,n} E= g(1..m) of record d, c : tên đỉnh; t : trọng số; end; Sử dụng S: đánh dấu đỉnh thuộc T • 1) sort g(1).t...g(m).t; • 2) for x=1 to n do S(x)=0; • 3) k:=1; T(k) := g(1); S(T(k).d) :=1; S(T(k).c) :=1; • 4)  := T(1).t; • 5) while (k<n-1) • a) j=2; while (S(g(j).d)=S(g(j).c)) j:= j +1; • c) k:= k+1; T(k):=g(j); •  := + T(k).t; • S(T(k).d):= 1; S(T(k).c):= 1; • 6) output T(1)..T(n-1), ; Time of Algorithm is O(nm) 2014-08-31 Dao Thanh Tinh 21

  22. Minimum Spanning Tree (6) • Thuật toán KRUSKAL • 1. T:= {}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a); • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T  { e}; • 3. Output T, (T); Xét cấu trúc: V={1, 2, ...,n} E= g(1..m) of record d, c : tên đỉnh; t : trọng số; end; Sử dụng S: đánh dấu cây con • 1) sort g(1).t...g(m).t; • 2) for x=1 to n do S(x)=x; k=0; =0; j=1; • 3) while (k<n-1) • a)while (S(g(j).d)=S(g(j).c)) j= j+1; • c) k:= k+1; T(k):=g(j); • =  + T(k).t; • p=S(T(k).d); h=S(T(k).c); • for x:=1 to n do if (S(x)=h) S(x)=p; • 4) output T(1)..T(n-1), ; Time of Algorithm is O(nm) 2014-08-31 Dao Thanh Tinh 22

  23. Minimum Spanning Tree (7) • Thuật toán PRIM (1) • 1. for all i V L(i):=∞; • 2. p(v) := null; L(v) := 0; • 3. H = V; • 4. while (H null) • L(a)=min{ L(x): xH}; H=H\{a}; • for all xV(a)H • if L(x) > f(a, x) then • {L(x) = f(a, x); p(x) := a;} • 5. output {(x,p(x)), xV, p(x)null;} Time of Algorithm is O(n2)  = 9+8+7+6+4 = 34 2014-08-31 Dao Thanh Tinh 23

  24. Minimum Spanning Tree (8) • Thuật toán PRIM • 1. for all i V L(i):=∞; • 2. p(v) := null; L(v) := 0; • 3. H = V; • 4. while (H null) • L(a)=min{ L(x): xH}; H=H\{a}; • for all xV(a)H • if L(x) > f(a, x) then • {L(x) = f(a, x); p(x) := a;} • 5. output {(x,p(x)), xV, p(x)null;} (a,b) (c,b) (d,f) (e,d) (f,c)  = 8+9+7+6+4 = 34 2014-08-31 Dao Thanh Tinh 24

  25. The Network Flow Problem T = {G,f} - mạng vận tải G={V,E} có hướng ! a, z : V(a)=, V+(z)= , a- cửa vào và z-cửa ra  e: f(e)- khả năng của mạng tại e Luồng trên mạng T  : E  Ro  e  E, 0(e)f(e)  v  V\{a,z} thoả mãn: Từ (1)  Q(a) = Q(z). Ký hiệu  = Q(a) - giá trị của luồng  2014-08-31 Dao Thanh Tinh 25

  26. The Network Flow Problem (2) Bài toán: Cho T = {G,f} Tìm  sao cho  đạt giá trị lớn nhất 2014-08-31 Dao Thanh Tinh 26

  27. The Network Flow Problem (3) • Thuật toán: • Ý tưởng: • Chọn luồng khởi tạo; • Tìm các đường tăng được (dãy các đỉnh từ cửa vào đến cửa ra mà ta có thể thêm hoặc bớt hàm  trên mỗi cung của dãy này cùng một giá trị nào đó mà vẫn đảm bảo là luồng đồng thời làm tăng giá trị của luồng). Ví dụ, dãy • { (x0x1) (x1x4)(x4 x3) (x3z) } • là đường tăng được. Thêm vào các cung trên dãy này một giá trị là 2. Hàm ’ nhận được vẫn là luồng. • 3. Lặp lại bước 2 cho đến khi không còn đường tăng được 2014-08-31 Dao Thanh Tinh 27

  28. The Network Flow Problem (4) • Thuật toán: • for each e  E do (e) := 0; •  := 0; • repeat • xoá nhãn, dấu • gán nhãn, dấu và tính giá trị tăng được *; • if  chưa cực đại • thực hiện tăng luồng ; •  :=  + *; • until  -cực đại; 2014-08-31 Dao Thanh Tinh 28

  29. The Network Flow Problem (5) • Gán nhãn, xác định giá trị tăng được *: • Gán chỉ số cho các đỉnh, u0 = a; • Gán dấu cho cung e thích hợp: • Nếu e=(uk,x), (e)<f(e) thì M(e)=‘+’, • Nếu e=(x,uk),(e)>0 thì M(e)= ‘‘. • 2) Nhãn của đỉnh x: L(x)={c(x), (x)} • c(x)=k, chỉ số của ukvà • giá trị  lớn nhất mà luồng  có thể tăng • được kể từ cửa vào cho đến nút x. • Nếu dấu e = (uk,x) là ‘+’ thì có thể tăng , ngược lại, nếu dấu e=(x,uk) là ‘-‘có thể giảm . Ví dụ, e=(x1,x4) có thể gán dấu + L(x4) = {1, 6} nếu xét dãy các đỉnh từ x0, x1, x4. 2014-08-31 Dao Thanh Tinh 29

  30. The Network Flow Problem (6) f =7  =1 f =8 f =2 f =7  =1  =1  =0 f =10 f =3  =0  =0 f =10  =0 f =15 f =3  =1  =1 u1 u4 z uo u2 u3 1) (u0) := +; R := {u0}; 2) while (R ) & (L(z)= { }) a) chọn uk R; R := R\{uk}; b) for each x  V+(uk) or x  V(uk) if L(x) = { } if (xV+(uk)) & ((uk,x)<f(uk,x)) c(x) = k; M(uk, x) = ‘+’; (x) = min{(uk), f(uk,x) - (uk,x)}; if (x,uk)>0 c(x) = k; M(x,uk) = ‘’; (x) = min { (uk), (x,uk) }; if (L(x){ }) R := R  {x} 3) if L(z) ={ } MAX() = TRUE else MAX() = FALSE; 4) * := (z); { 0 ,7} {1,6} + + + {4,1} { 0,10} { ,} + + { 0,2} *=1 R={ u1 , u2 , u3 R={u4, u2, u3 R={ uo R={u2, u3 R={u2, u3 2014-08-31 Dao Thanh Tinh 30

  31. The Network Flow Problem (7) f =7  =1 f =8 f =2 f =7  =1  =1  =0 f =10 f =3  =0  =0 f =10  =0 f =15 f =3  =1  =1 u1 u4 z uo u2 u3 x := z; while x  u0 j := c(x); if (M(uj,x)=‘+’) (uj,x) = (uj,x)+* else (x,uj) = (x,uj)- *; x = uj; { 0 ,7} {1,6} *=1 + + + {4,1} { 0,10} { ,} + + x = z, j = c(x) = 4 (u4,z) = (u4,z) + 1 x = u4 j = c(x) = 1 (u1,u4) = (u1,u4) + 1 x = u1 j = c(x) = 0 (u0,u1)=(u0,u1) + 1 x = u0. STOP. { 0,2} 2014-08-31 Dao Thanh Tinh 31

  32. The Network Flow Problem (8) f =7  =1 f =8 f =2 f =7  =1  =1  =0 f =10 f =3  =0  =0 f =10  =0 f =15 f =3  =1  =1 u1 u4 z uo u2 u3 Định nghĩa W  V\ {z}, a W, W* := V \W. Nhát cắt: (W,W*) ={ e=(u,v): u W, u W*} Dung lượng f(W,W*) =f(e), e (W,W*) Ví dụ: W = {u0, u1, u2} W*={u3, u4, z} (W,W*) = {(u0,u3), (u1,u4), (u2,u3)} f(W,W*) = 3+7+10 = 20 Định lý max z bằng giá trị bé nhất của các nhát cắt trong mạng T 2014-08-31 Dao Thanh Tinh 32

  33. The Network Flow Problem (8) {2,2} {0,1}  + { ,} + {0,2} f =7 f =7  =7  =7 f =8 f =8 f =2 f =2 f =7 f =7  =7  =7  =2  =2  =2  =2 f =10 f =10 f =3 f =3  =3  =3  =8  =8 f =10 f =10 =10 =10 f =15 f =15 f =3 f =3 =16 =16  =3  =3 u1 u1 u4 u4 z z uo uo u2 u2 u3 u3 Định lý max z = giá trị bé nhất của các nhát cắt trong mạng T • Chứng minh • Giả sử  -luồng cực đại. • Thực hiện thủ tục gán nhãn. • Kí hiệu W ={xV: L(x)}, W* = V\W • Do a W, z  W  (W,W*) – nhát cắt. • Nếu cửa ra z W, L(z) , tăng luồng = +(z). Mâu thuẫn! Vì - luồng cực đại. • Xét(x,y)(W,W*).Rõ ràng (x,y) = f(x,y) • Nếu (x,y)<f(x,y) L(y) , yW, trái với giả thiết y  W* • Xét (u,v)E, uW*, vW (u,v) = 0. • Nếu (u,v)>0 thì L(u) , uW. • Như vậy, (W,W*)=f(W,W*), (W*,W)=0. • Tự chứng minh: (W,W*)(W*,W) f(W,W*)  = 18 2014-08-31 Dao Thanh Tinh 33

  34. The Network Flow Problem (8) {2,2} {0,1}  + { ,} + {0,2} f =7 f =7  =7  =7 f =8 f =8 f =2 f =2 f =7 f =7  =7  =7  =2  =2  =2  =2 f =10 f =10 f =3 f =3  =3  =3  =8  =8 f =10 f =10 =10 =10 f =15 f =15 f =3 f =3 =16 =16  =3  =3 u1 u1 u4 u4 z z uo uo u2 u2 u3 u3 Định lý max z = giá trị bé nhất của các nhát cắt trong mạng T Xét mạng đã gán nhãn với L(z)=. W = {u0, u1, u2, u4} W*={u3, z} (W,W*) = {(u0,u3), (u2,u3), (u4,u3), (u4,z)} f(W,W*) = 3+10+3+2 = 18 (W,W*) = 18 (W*,W) = 0  = 18 2014-08-31 Dao Thanh Tinh 34

  35. The Network Flow Problem (8) Author(s) Y ear Complexity Ford; Fulkerson 1956 Edmonds; Karp 1969 O(E2V ) Dinic 1970 O(EV2) Karzanov 1973 O(V3) Cherkassky 1976 O(EV2) Malhotra; et al : 1978 O(V3) Galil 1978 O(V5/3.E2/3) Galil and Naamad 1979 O(EV.log2V ) Sleator and Tarjan 1980 O(EV.log V ) Goldberg and Tarjan 1985 O(EV.log (V2/E)) 2014-08-31 Dao Thanh Tinh 35

  36. Mạng PERT (1) • Bài toán: • Dự án A có n công việc tên là 1, 2, …, n. Việc thứ i, i=1,..,n, có một số việc tiên quyết, lưu trong danh sách Ci, tức là bắt buộc phải thực hiện xong các việc trong Ci mới được thực hiện việc i. Trong điều kiện cho trước, việc i cần thời gian ti để hoàn thành. • Dự án A được khởi động vào thời điểm t0. • Tính thời điểm sớm nhất T có thể hoàn thành dự án A. • Trong thời hạn đã được nêu ra ở phần 1) hãy chỉ ra thời điểm bắt đầu sớm nhất, muộn nhất có thể được đối với từng công việc và thời gian dự trữ của từng công việc. 2014-08-31 Dao Thanh Tinh 36

  37. Mạng PERT (2) Ví dụ P1: 2014-08-31 Dao Thanh Tinh 37

  38. Mạng PERT (3) Sử dụng mô hình đồ thị có hướng G={V,E}: Mỗi công việc tương ứng với một đỉnh V ={1, 2,...,n}. Thêm vào 2 đỉnh đặc biệt là 0 và n+1, ý nghĩa là Khởi công và Kết thúc. t0 = 0, C0 = . Với  i  {1,...,n}, Ci= , đặt Ci= {0}, tn+1= 0, Cn+1={j  {1,...,n}: jCk,  k=1,2...,n} u  Cv  (u,v)  E f(u,v) = tu. 2014-08-31 Dao Thanh Tinh 38

  39. Mạng PERT (4) Thuật toán: Kí hiệu: xi – thời điểm sớm nhất bắt đầu việc i yi – thời điểm sớm nhất kết thúc việc i pi – thời điểm muộn nhất kết thúc việc i xj = max { xi + f(i,j) :  i Cj }. pi = min { pj - f(i,j),  j mà (i,j) E }. Đặt t0=0. Suy ra: x0=0, T = xn+1 = yn+1 = pn+1 2014-08-31 Dao Thanh Tinh 39

  40. Mạng PERT (5) xj = max { xi + f(i,j) :  i Cj }. 2014-08-31 Dao Thanh Tinh 40

  41. Mạng PERT (6) pi = min { pj - f(i,j),  j mà (i,j) E }. 2014-08-31 Dao Thanh Tinh 41

  42. Mạng PERT (7) 2014-08-31 Dao Thanh Tinh 42

More Related