1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận Phân tích và thiết kế thuật toán FLOW NETWORKS

104 1,5K 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 104
Dung lượng 3,08 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài toán luồng cực đại trên mạngCho một mạng vận tải G = V, E, hãy tìm luồng f có giá trị lớn nhất từ đỉnh phát s đến đỉnh thu t... Lát cắtĐịnh lý • Định lý lát cắt cực tiểu luồng cực đạ

Trang 1

MAXIMUM FLOW

• Flow networks Minh Hòa

• The Fork-Fulkerson method Hoài Nhân

• Maximum biparite matching Phú Lộc

• Push-relabel algorithms Quang Minh

• The relabel-to-front algorithms Thế Quân

Trang 3

Nội dung

• Mạng vận tải

• Luồng

• Mạng có nhiều đỉnh phát và nhiều đỉnh thu

• Làm việc với nhiều luồng

Mạng vận tải

Trang 4

Nếu (i, j) E thì c(e) = 0.

 vV, tồn tại đường đi s  v  t Vậy đồ thị liên thông và |E| ≥ |V| - 1

Trang 5

4 14

v2

20 9

4

12

10 16

13

Đỉnh thu Đỉnh phát

Mạng vận tải

Ví dụ

Trang 6

Cho N = (G = (V, E), c, s, t) là một mạng vận tải Một luồng trong N là ánh xạ f: V x

V -> R thỏa mãn các điều kiện sau:

• Tính ràng buộc về khả năng thông qua của luồng :

u, v  V: (u, v)  c(u, v).

Trang 7

• Do đồ thị không có khuyên nên:

• Giá trị của luồng  được xác định như sau:

Trang 8

Luồng

Ví dụ

Trang 9

• Một mạng vận tải có thể mô phỏng bài toán vận chuyển bóng của một công ty từ nhà máy (s) đến kho (t) như trong hình sau:

v4

t

v3 v1

4 14

v2

20 9

3

12

8 16

13

Ví dụ sự khác biệt giữa vận chuyển và luồng

Luồng

Trang 10

• Họ không kiểm soát những lộ trình giữa các thành phố (các đỉnh) và các khả năng thông qua của các lộ trình.

• Mục đích: xác định số lượng thùng lớn nhất p có thể được vận chuyển mỗi ngày.

• Họ chỉ quan tâm đến số lượng thùng

p rời nhà máy và số lượng thùng p

đến kho mỗi ngày.

Luồng

Ví dụ sự khác biệt giữa vận chuyển và luồng

Trang 11

• Bề ngoài, dường như thích hợp để mô phỏng “luồng” với việc vận chuyển trong mạng này, bởi vì số lượng thùng được vận chuyển mỗi ngày từ thành phố này đến thành phố khác là khó tránh khỏi sự liên quan đến khả năng thông qua của luồng

• Sự bảo toàn luồng cũng phải được tuân theo

Luồng

Ví dụ sự khác biệt giữa vận chuyển và luồng

Trang 12

• Có một sự khác biệt giữa sự vận chuyển và luồng.

• Giả sử công ty vận chuyển 8 thùng mỗi ngày từ v1 đến v2 và 3 thùng mỗi ngày từ v2 đến v1.

• Dường như có thể biểu diễn sự vận chuyển bằng luồng nhưng không thể

Luồng

Ví dụ sự khác biệt giữa vận chuyển và luồng

Trang 13

• Do tính đối xứng, nên không thể xem

(v1, v2) = 8 và (v2, v1) = 3 Nên biểu diễn là: (v1, v2) = 5 và (v2, v1) = -5

• Nếu bóng được vận chuyển theo cả hai hướng giữa hai thành phố thì có thể hủy

bỏ thành một trường hợp, trong đó bóng được vận chuyển chỉ theo hướng có giá trị dương

• Phương pháp hủy bỏ sẽ phát sinh trong toàn bộ thuật toán

Luồng

Ví dụ sự khác biệt giữa vận chuyển và luồng

Trang 14

• Giả sử cung (u, v) tương ứng với một luồng có giá trị (u, v)

• Trong quá trình khai triển thuật toán,

có thể tăng luồng trên cung (v, u) bằng cách thêm giá trị d

• Thao tác đó làm giảm (u, v) một lượng d

Luồng

Ví dụ sự khác biệt giữa vận chuyển và luồng

Trang 15

• Ví dụ: Một công ty có thể có một tập m nhà máy bao gồm {s1, s2,…, sm} và một tập n kho bao gồm {t1, t2,…, tn}.

Mạng có nhiều đỉnh phát và nhiều

đỉnh thu

Phát biểu

Trang 16

t3 t2

Trang 17

t3 t2

Trang 18

t3 t2

Trang 19

Làm việc với nhiều luồng

Các luồng mạng

• Tổng giá trị dương của luồng đi vào đỉnh v:

• Tổng giá trị dương của luồng ra khỏi đỉnh v:

• Tổng giá trị của luồng tại đỉnh v:

• Do tính bảo toàn luồng

nên = 0

w (w , ) 0

Trang 22

• Cho N là một mạng vận tải và  là một luồng trong N Khi đó có các tính chất sau:

 X  V, ta có: (X, X) = 0

 X, Y  V, ta có: (X, Y) = - (Y, X)

 X, Y, Z  V với X Y = Ø ta có các ∩ Y = Ø ta có các tổng: (XY, Z) = (X, Z) + (Y, Z)

và (Z, XY) = (Z, X) + (Z, Y)

Làm việc với nhiều luồng

Bổ đề

Trang 23

• Xét ví dụ có sử dụng ký hiệu tổng ẩn,

có thể chứng minh rằng nếu N là một mạng vận tải và f là một luồng thì:

Trang 24

FORK- FULKERSON METHOD

(PHƯƠNG PHÁP FORK -

FULKERSON)

Phan Văn Hoài Nhân

Trang 25

• Bài toán luồng cực đại trên mạng

Trang 26

Bài toán luồng cực đại trên mạng

Cho một mạng vận tải G = (V, E), hãy

tìm luồng f có giá trị lớn nhất từ đỉnh

phát s đến đỉnh thu t

Trang 27

Mạng thặng dư

Khái niệm

• Từ một mạng G = (V, E) và một luồng f trên G ta xây dựng mạng Gf = (V, Ef), với tập cạnh Ef được định nghĩa bằng tập cạnh

E bỏ đi cung bão hòa (luồng trên cung đó bằng khả năng thông qua)

Trang 28

• Nếu e = (v, w) thuộc E với 0 < f(v, w) < c(v,w) thì (v, w) thuộc Ef với trọng số c(v,w) - f(v,w) và (w, v) thuộc Ef với trọng số f(v,w).

Mạng thặng dư

Trang 29

3:1 0:3

5:5

2

1 1

3

3

5

5

2

1

Trang 30

Đường tăng luồng

Khái niệm

• Cho mạng G= (V, E) và luồng f, đường tăng luồng p là một đường đi cơ bản từ đỉnh s đến đỉnh t trên mạng thặng dư Gf

• Với mỗi đường tăng luồng p:

cf(p) = min{cf(u,v) | (u,v)  p}

là giá trị nhỏ nhất của các khả năng thông qua trên các cung trên p và gọi

cf(p) là giá trị thặng dư của đường p

Trang 32

3 2:3

5:5

5

5

2

1

• Với mạng G, luồng f và mạng Gf như hình trên, giả sử P = <1, 3, 4,

2, 5 ,6> với giá trị cf(p) = 2 Luồng fP trên Gf sẽ là:

fP[1,3]=fP[3,4]=fP[4,2]=fP[2,5]=fP[5,6] = 2

fP[3,1]=fP[4,3]=fP[2,4]=fP[5,2]=fP[6,5] = -2

• Cộng các giá trị này vào giá trị luồng f tương ứng trên các cung, ta

sẽ có luồng mới có giá trị 9

Ví dụ

Đường tăng luồng

Trang 33

• Luồng của lát cắt (S,T) là f(S,T).

• Khả năng thông qua của lát cắt (S,T) là c(S,T)

Trang 35

Lát cắt

Định lý

• Định lý lát cắt cực tiểu luồng cực đại:

Nếu f là một luồng trong mạng vận tải G

= (V,E) với đỉnh phát s và đỉnh thu t thì các điều kiện sau là tương đương:

1.f là một luồng cực đại trong G

2.Mạng thặng dư Gf không chứa đường tăng luồng nào

3.| f | = c(S,T) đối với lát cắt (S,T) của G

Trang 36

Thuật toán Fork-Fulkerson

Trang 37

Thuật toán Fork-Fulkerson

13

4/9 4/16

Trang 38

Thuật toán Fork-Fulkerson

Trang 39

Thuật toán Fork-Fulkerson

7

Trang 40

Thuật toán Fork-Fulkerson

12

4 3

15 5

Trang 41

Thuật toán Fork-Fulkerson

Trang 42

Thuật toán Fork-Fulkerson

Độ phức tạp tính toán

• Định lý: Nếu mọi khả năng thông qua là số nguyên thì thuật toán trên luôn tìm được luồng cực đại với luồng trên cung là các số nguyên.

• Định lý : Edmonds và Karp chứng minh:

– Nếu dùng phương pháp duyệt theo chiều rộng để tìm đường tăng luồng trên mạng được biểu diễn theo kiểu danh sách kề thì độ phức tạp của thuật toán Ford-Fulkerson là O(n.m 2 ).

– Tuy nhiên, nếu khả năng thông qua trên các cung của mạng là số nguyên thì độ phức tạp tính toán của thuật toán Ford-Fulkerson là O(|f*|.m) với |f*|

là giá trị luồng cực đại trên mạng.

Trang 43

Lê Thị Phú Lộc

MAXIMUM BIPARITE MATCHING

(BỘ GHÉP ĐÔI CỰC ĐẠI)

Trang 46

Các khái niệm

Đồ thị hai phía

 Đồ thị G = (V,E) mà tập đỉnh V có thể

chia thành 2 tập đỉnh con L (tập đỉnh con

trái) và R (tập đỉnh con phải)

 Bất kì cạnh e  E đều là cạnh nối từ

đỉnh l  L đến đỉnh r  R

Ví dụ: Bài toán phân lịch dạy của giáo

viên

- Tập L biểu thị cho tập hợp các giáo viên

- Tập R biểu thị cho tập các môn học

- Cạnh nối từ LR biểu thị giáo viên dạy

môn tương ứng.

Trang 50

v u

Trang 51

 Để tìm ra bộ ghép cực đại của đồ thị

hai phía G = (V,E) ta thực hiện:

 Đưa bài toán tìm bộ ghép cực đại trên

đồ thị hai phía G về dạng bài toán tìm luồng cực đại trên mạng luồng G’.

 Dùng phương pháp Ford- Fulkerson để

giải quyết bài toán.

Phương pháp tìm bộ ghép đôi cực đại

Trang 52

• Để chuyển từ đồ thị hai phía G sang đồ thị dạng mạng

luồng G’ ta thực hiện:

– Thêm một đỉnh phát s và các cạnh nối từ s đến L

– Thêm một đỉnh thu t và các cạnh nối từ R đến t

– Tất cả các cạnh E và các cạnh thêm vào có hướng từ

1 1 1 1 1

1

1 1

G

Phương pháp tìm bộ ghép đôi cực đại…

Trang 53

Yêu cầu :

Luồng cực đại trong G’ phải tương ứng

với bộ ghép cực đại của G

1 1 1 1 1

Trang 54

• Bổ đề:

Cho G = (V,E) là một đồ thị hai phía có phân hoạch đỉnh

V=LR, và đặt G’=(V’,E’) là mạng luồng tương ứng của G Nếu M là một bộ ghép trong G, thì có một luồng có giá trị số nguyên f trong G’ thỏa :

f = M

Ngược lại, nếu f là một luồng có giá trị nguyên trong G’, thì

sẽ tồn tại một bộ ghép M trong G với số phần tử (độ lớn) của

M thỏa:

M = f

Một số định lý và bổ đề

Trang 55

Định lý bảo toàn

 Nếu hàm khả năng c có giá trị bảo toàn thì luồng cực đại

f được tạo bằng phương pháp Ford-Fulkerson sẽ có tính chất fcó giá trị số nguyên.

 Ngoài ra, với tất cả các đỉnh u và v, giá trị của f(u,v) là một số nguyên

Hệ quả

Độ lớn của một bộ ghép cực đại trong một đồ thị hai

phía G là giá trị của một luồng cực đại trong mạng luồng tương ứng G’ của nó.

Một số định lý và bổ đề

Trang 56

• Vấn đề tìm bộ ghép cực đại trên đồ thị hai phía giúp giải quyết khá nhiều các bài toán tổ hợp ứng dụng trong thực tế

– Bài toán các sinh viên chọn trường

– Bài toán thầy giáo chọn thời khóa biểu trong tiết dạy – Bài toán lập lịch cho hội nghị

– Bài toán đám cưới vùng quê

– Bài toán phân việc cho các nhân viên trong công ty

– .

Một số ứng dụng

Trang 57

PUSH – RELABLE ALGORITHMS (Thuật toán Đẩy - Gán lại nhãn)

Lê Quang Minh

Trang 58

 Tổng quan về thuật toán

Trang 59

 Đây là phương pháp tính luồng cực đại tổng quát

do Goldberg đề xuất với độ phức tạp là O(V 2 E)

 Phương pháp “push-relabel" chỉ làm việc trên

một đỉnh tại một thời điểm nhằm tìm ra các đỉnh lân cận trong mạng thặng dư

1 1

1 1

1 1 1 1

Trang 60

• Với ví dụ trên thì phương pháp Fork-Fulkerson sẽ tìm ra 5 đương tăng luồng từ s đến t Mỗi đường tăng luồng sẽ tăng thêm 1 đơn vị luồng.

• Phương pháp Push – Relable sẽ làm như sau: đầu tiên sẽ đẩy một luồng có 5 đơn vị luồng từ đỉnh s tới đỉnh 4 Sau đó sẽ lần lượt đẩy 5 luồng có 1 đơn

vị luồng tới đỉnh t.

Trang 61

 Trong quá trình thực hiện thuật toán duy trì một luồng trước

Trang 62

1/3 2/2

4/5

e(1)=1

e(2)=0

t 1

Trang 63

• Ta coi mạng vận tải G = (V,E) như một hệ thống đường ống dẫn nước thông nhau với khả năng thông qua là lưu lượng có thể tải

• Các cung chính là các đường ống Các đỉnh, là nơi giao nhau của các đường ống

• Chúng ta chỉ đẩy nước từ trên xuống, tức là từ một đỉnh cao đến đỉnh thấp hơn

• Chiều cao của đỉnh nguồn là |V|, và chiều cao của đỉnh thu là 0 Tất cả chiều cao của các đỉnh khác bắt đầu từ 0 và tăng theo thời gian

Mô tả trực quan

Trang 64

 Cho một lượng nước lớn phát ra từ nguồn tới một đỉnh v, nếu đỉnh v bị “quá tải” thì ta

nâng độ cao của đỉnh v để nước có thể đổ sang các đỉnh khác Cứ tiếp tục như vậy cho tới khi không còn đỉnh quá tải nào.

 Thuật toán sẽ kết thúc khi tất cả nước chảy xuống đỉnh thu hoặc quay trở lại nguồn.

Mô tả trực quan

Trang 65

 Cho mạng vận tải G = (V, E) với đỉnh phát là s là đỉnh thu là t, và f là một luồng trước trong G Một hàm chiều cao h : V → N được xác định bởi

4/4

1/3 2/2

4/5

h(1)=1

h(2)=1

h(t)=0 h(s)=4

Định nghĩa hàm chiều cao

Trang 68

• Vì e[u] > 0, chúng ta có: e[u] = f(V,u) > 0

và do đó, phải có ít nhất một đỉnh v sao cho f[v,u] > 0

• Và: cf(u,v) = c(u,v) – f[u,v]

Trang 70

• Chương trình con INITIALIZE-PREFLOW tạo một luồng trước ban đầu f định nghĩa bởi:

c(u,v) nếu u = s

f[u,v] = - c(v,u) nếu v = s

0 nếu ngược lại

• Thuật toán tổng quát cũng bắt đầu với việc khởi tạo hàm chiều cao h được xác định:

Trang 72

Ví dụ: Tìm luồng cực đại cho mạng vận tải

5

e(s)=0

h(s)=4

e(2)=0 h(2)=1

e(3)=0 h(3)=1

e(t)=0 h(t)=0

Các bước thực hiện

Ví dụ

Trang 73

Sau khi thực hiện thủ tục INITIALIZE-PREFLOW(G,s)

ta có mạng vận tải như sau:

5

e(s)=-6 h(s)=4

e(2)=2 h(2)=0

e(3)=4 h(3)=0

e(t)=0 h(t)=0

5

e(s)=0

h(s)=4

e(2)=0 h(2)=1

e(3)=0 h(3)=1

e(t)=0 h(t)=0

Trang 74

• Bước 1: Thực hiện gán lại nhãn cho đỉnh 2

5

e(s)=-6 h(s)=4

e(2)=2 h(2)=1

e(3)=4 h(3)=0

e(t)=0 h(t)=0

5

e(s)=-6

h(s)=4

e(2)=2 h(2)=0

e(3)=4 h(3)=0

e(t)=0 h(t)=0

Trang 75

• Bước 2: Chọn đỉnh 2 để thực hiện phép đẩy tới đỉnh

t Phép đẩy này là bão hòa

5

e(s)=-6 h(s)=4

e(2)=1 h(2)=1

e(3)=4 h(3)=0

e(t)=1 h(t)=0

5

e(s)=-6

h(s)=4

e(2)=2 h(2)=1

e(3)=4 h(3)=0

e(t)=0 h(t)=0

Trang 76

• Bước 3: Thực hiện gán lại nhãn cho đỉnh 3

5

e(s)=-6 h(s)=4

e(2)=1 h(2)=1

e(3)=4 h(3)=1

e(t)=1 h(t)=0

5

e(s)=-6

h(s)=4

e(2)=1 h(2)=1

e(3)=4 h(3)=0

e(t)=1 h(t)=0

Trang 77

• Bước 4: Chọn đỉnh 3 để thực hiện phép đẩy tới đỉnh

t Phép đẩy này là không bão hòa

3 s

4

3 2

1

e(s)=-6 h(s)=4

e(3)=0 h(3)= 1

e(t)=5 h(t)=0

5

e(s)=-6

h(s)=4

e(2)=1 h(2)=1

e(3)=4 h(3)=1

e(t)=1 h(t)=0

Trang 78

• Bước 5: Thực hiện gán lại nhãn cho đỉnh 2

3 s

4

3 2

1

e(s)=-6 h(s)=4

e(3)=0 h(3)=1

e(t)=5 h(t)=0

4

t

e(2)=1 h(2)=1

3 s

4

3 2

1

e(s)=-6

h(s)=4

e(3)=0 h(3)= 1

e(t)=5 h(t)=0

4

Trang 79

• Bước 6: Chọn đỉnh 2 để thực hiện phép đẩy tới đỉnh

3 Phép đẩy này là không bão hòa

3 s

4

2 2

1

e(s)=-6 h(s)=4

e(3)=1 h(3)=1

e(t)=5 h(t)=0

3 s

4

3 2

1

e(s)=-6

h(s)=4

e(3)=0 h(3)=1

e(t)=5 h(t)=0

4

Trang 80

• Bước 7: Chọn đỉnh 3 để thực hiện phép đẩy tới đỉnh

3 s

4

2 2

e(s)=-6 h(s)=4

e(3)=0 h(3)=1

e(t)=6 h(t)=0

3 s

4

2 2

1

e(s)=-6

h(s)=4

e(3)=1 h(3)=1

e(t)=5 h(t)=0

4

1

Trang 81

Nếu thuật toán PUSH-RELABEL kết thúc khi thực hiện trên một mạng vận tải G

=(V,E) với đỉnh phát s và đỉnh thu t, thì luồng trước f được tính là một luồng cực đại trong G

Tính đúng đắn của thuật toán

Trang 82

Độ phức tạp của thuật toán RELABEL trên bất kì mạng vận tải G=(V,E) là O(V2E).

Độ phức tạp của thuật toán

Trang 83

RELABEL–TO–FRONT ALGORITHMS

(THUẬT TOÁN RELABLE–TO-FRONT)

Trịnh Thế Quân

Trang 84

3.1 3.2

Cài đặt chương trình

5

Nội dung

Trang 85

Thuật toán Relabel To Front là một sự thực thi đầy đủ của thuật toán Push-Relabel tổng quát Nó cho phép chúng ta tìm được luồng cực đại trong một mạng vận tải G=(V, E) với độ phức tạp tính toán là O(|V|

Trong đó:

V: tập các đỉnh E: tập các cạnh |V|: số đỉnh

Mô tả thuật toán

Trang 86

Như vậy thì bài toán của chúng ta sẽ có đầu vào và đầu ra tương ứng là:

Mạng vận tải G=(V, E) với đỉnh phát là s

và đỉnh thu là t, các khả năng thông qua là c(u,v) với u,v V và c(u,v)>0 nếu (u,v) E, c(u,v)=0 nếu (u,v) E

Trang 87

Trong thuật toán Relabel To Front, các đỉnh của mạng vận tải G=(V, E) (trừ 2 đỉnh s và t) được lưu trong một danh sách liên kết L, mỗi đỉnh u trong danh sách

L lại được trỏ tới vị trí đầu tiên của một danh sách liên kết khác gọi là danh sách kề của u, ký hiệu là N Danh sách này sẽ chứa các đỉnh láng giềng của u

Ví dụ: Cho mạng vận tải như hình dưới

Ta có thể mô tả trực quan cách lưu trữ như sau:

Mô tả thuật toán

Trang 88

X Y T

NIL

NIL

Head Next Current

Next Neighbor

Mô tả thuật toán

Trang 89

Thuật toán duyệt qua danh sách các đỉnh trong danh sách L, lập lại việc chọn một đỉnh tràn u và sau

ứng với việc thực hiện các thao tác Push và Relabel cho đến khi đỉnh u không còn tràn nữa Khi một đỉnh được gán lại nhãn (Relabel), nó được chuyển tới trước danh sách và thuật toán bắt đầu duyệt đỉnh tiếp theo.

Khi thuật toán duyệt đến cuối danh sách L thì kết thúc và ta được kết quả.

Trước khi đi vào phần giải thuật, chúng ta cần tìm hiểu qua một số khái niệm và bổ đề liên quan đến giải thuật ở phần tiếp theo.

Mô tả thuật toán

Trang 90

Khái niệm cạnh có thể chấp nhận được:

Nếu G=(V,E) là một mạng vận tải với đỉnh đầu s và đỉnh cuối t, f là một luồng trước đó trong G, và h là một hàm chiều cao (height function), chúng ta nói rằng (u,v) là một cạnh

có thể chấp nhận được nếu cf(u,v)>0 và h(u) = h(v)+1 Ngược lại, (u,v) là cạnh không thể chấp nhận được

Mạng có thể chấp nhận được là Gf,h = (V,

Ef,h) trong đó Ef,h được lập từ các cạnh có thể chấp nhận được

Một số khái niệm và bổ đề

Trang 91

Bổ đề 26.27 (mạng có thể chấp nhận được không có chu trình)

Nếu G=(V,E) là một mạng vận tải, f là một luồng trước trong G, và h là hàm chiều cao trong G, khi đó mạng có thể chấp nhận được Gf,h = (V,Ef,h) không có chu trình.

Cho G = (V,E) là một mạng vận tải, cho f là một luồng trước trong G, và giả sử rằng h là một hàm chiều cao, u là đỉnh tràn và (u,v) là cạnh có thể chấp nhận được, sau đó áp dụng PUSH(u,v) Thao tác không tạo ra một vài cạnh mới có thể chấp nhận được, nhưng nó có thể là nguyên nhân khiến (u,v) trở nên không chấp nhận được.

Một số khái niệm và bổ đề

Ngày đăng: 11/04/2015, 22:06

HÌNH ẢNH LIÊN QUAN

Đồ thị hai phía - Tiểu luận Phân tích và thiết kế thuật toán FLOW NETWORKS
th ị hai phía (Trang 46)
Đồ thị hai phía G về dạng bài toán tìm  luồng cực đại trên mạng luồng G’. - Tiểu luận Phân tích và thiết kế thuật toán FLOW NETWORKS
th ị hai phía G về dạng bài toán tìm luồng cực đại trên mạng luồng G’ (Trang 51)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w