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

lý thuyết đồ thị và các giải thuật trên một số bài toán cơ bản

57 467 0
Tài liệu được quét OCR, nội dung có thể không chính xác

Đ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 57
Dung lượng 4,79 MB

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

Nội dung

Cặp đỉnh x, y được nối với nhau bằng cạnh hay cung a, thi x,y được gọi là các đỉnh hay hai đầu của cạnh hay cung a và a được gọi là cạnh hay cung thuộc đỉnh x, đỉnh y.. Được gọi là đồ th

Trang 1

LỜI MỞ Đầu Trong nhiều tình huống, do thói quen người ta thường vẽ lên giấy những điểm biểu thị cho các cá thể, khu dân cư, các đơn vị hành chính, các nút giao thông, các hoá chất .và nối các điểm đó với nhau bằng những nét hoặc những mũi tên tượng trưng cho một mối liên hệ nào đó Các sơ đồ này dùng ở khắp mọi

nơi với các tên gọi khác nhau.Trong tâm lí học gọi nó là xã hội đồ Trong kinh

tế gọi là sơ đồ tổ chức Trong giao thông vận tải gọi là mạng giao thông Chính D.Konig là người đầu tiên đề nghị gọi các sơ đồ như trên là “đồ thị”, đồng thời đề nghị nghiên cứu một cách có hệ thống các tính chất của nó Một điều rất đáng quan tâm là nhiều nghành khoa học hoàn toàn khác nhau

lại dùng những định lí giống nhau; chẳng hạn, khái niệm ” ma trận liên thuộc”,

do G.R.Kirchhoof đưa ra để nghiên cứu mạch điện, song đã được Henri Poincare dùng lại trong tôpô học để xây dựng ”analysis sictus” của nó Khái

niệm “điểm khớp” đã xuất hiện từ lâu trong xã hội học, đến gần đây lại xuất hiện trong ngành điện tử Những thí dụ như trên nhiều vô kể Điều này chứng

tỏ lí thuyết đồ thị được hình thành từ thực tế nó rất có nhiều ứng dụng trong xã hội

Vì vậy tác giả đã chọn lý thuyết đồ thị để làm đề tài tốt nghiệp cuối khoá Khoá luận của tác giả gồm hai phần:

Phần I: Lý thuyết

Phần này trên cơ sở của tài liệu [1] và [2] tác giả trình bày các khái niệm và

định lý cơ bản trong các bài sau đây:

§1 Các khái niệm cơ bản

§ 2 Xích, chu trình và đồ thị liên thông

§ 3 Hàm GRANDI, chu số và cây

§ 4 Các tập hợp trên đồ thị

§5 Đồ thị EULER và đồ thị HAMILTON

§6 Các phương pháp tìm kiếm

Trang 2

Phần II: Các giải thuật của các bài toán cơ bản về lý thuyết đồ thị trên ngôn

ngữ lập trình Pascal

Phần này trên cơ sở của tài liệu [2] tác giả trình bày mười bốn thuật toán và

các chương trình viết bằng ngôn ngữ Pascal kèm theo

Để hoàn thành khoá luận này tôi đã tham khảo nhiều tài liệu khác nhau và nhận được nhiều ý kiến đóng góp của các thầy cô giáo đặc biệt là sự hướng dẫn tận tình, chu đáo của thầy giáo hướng dẫn khoa học Nhân dịp này tôi xin bày

tỏ lời cảm ơn chân thành tới thây giáo Trần Văn Hữu và cùng toàn thể các thây cô đã tận tình giúp đỡ

Mặc dù đã cố gắng nhiều nhưng do trình độ còn hạn chế khoá luận này không tránh khỏi những hạn chế, thiếu sót Rất mong nhận được sự góp ý chân thành

và được lượng thứ

Tác giả

Trang 3

cạnh có hướng hay cung

Đồ thị chỉ chứa các cạnh được gọi là đồ thị vô hướng, còn đồ thị chỉ chứa các cung gọi là đồ thị có hướng Nếu đồ thị chứa cả cạnh lẫn cung thì nó được gọi là đồ thị hỗn hợp

Một cặp đỉnh có thể được nối với nhau bằng hai hay nhiều hơn hai cạnh (hai hoặc nhiều hơn hai cung cùng một hướng) Các cạnh hay cung này được gọi là các cạnh hay cung bội

Một cung hay một cạnh có thể bắt đầu và kết thúc tại cùng một đỉnh Cung hay cạnh loại này được gọi là khuyên hay nút

Cặp đỉnh x, y được nối với nhau bằng cạnh hay cung a, thi x,y được gọi là các đỉnh hay hai đầu của cạnh hay cung a và a được gọi là cạnh hay cung thuộc đỉnh x, đỉnh y

Nếu cung b xuất phát từ đỉnh u và đi vào đỉnh v thì u được gọi là đỉnh đầu, còn v được gọi là đỉnh cuối của cung b

Cặp đỉnh x,y được gọi là hai đỉnh kề nhau nếu xzy và là hai đầu của cùng

Trang 4

Trong những trường hợp không cần phân biệt giữa cạnh và cung ta quy ước

dùng cạnh thay cho cả cung Đồ thi G(X,E) không có nút và một cặp đỉnh được nối với nhau bằng không quá một canh Được gọi là đồ thị đơn hay đơn

đồ thị và thông thường được gọi là đồ thị

Đồ thị G (X, E) không có nút và có ít nhất một cặp đỉnh được nối với nhau

bằng từ hai cạnh trở lên được gọi là đa đồ thị

Đồ thị (đa đồ thị) G (X, E) được gọi là đồ thị đầy đủ nếu mỗi cặp đỉnh được nối với nhau bằng đúng một cạnh (một cung với chiều tuỳ ý)

Đa đồ thị vô hướng (có hướng) G(X,E) được gọi là đồ thị k- đầy đủ, nếu mỗi cặp đỉnh được nối với nhau bằng đúng k cạnh (k cung với chiều tuỳ ý)

Đồ thị (đa đồ thị) G(X,E) được gọi là đồ thị (đa đồ thị) hai mảng nếu tập đỉnh X của nó được phân thành hai tập con rời nhau X,,X; (X, U X;=X và X,ñnX;, z Ø) và mỗi cạnh đều có một đầu thuộc X, còn đầu kia thuộc X,

Khi đó G(X,E) còn được kí hiệu bằng G(X,, X,, E)

Trang 5

Đồ thị (đa đồ thị) GŒX,E) được gọi là đồ thị (đa đồ thị) phẳng, nếu có ít

nhất một dạng biểu diễn hình học trải trên một mặt phẳng nào đó mà các

cạnh của đồ thị chỉ cắt nhau ở đỉnh

D6 thi (da d6 thi) G(X,E) được gọi là hữu hạn nếu số đỉnh của nó là hữu

hạn Tức tập X có lực lượng hữu hạn

Đồ thị (đa đồ thị) với tập đỉnh vô hạn được gọi là Đồ thị (đa đồ thị) vô hạn

Đồ thị (đa đồ thị) với số cạnh thuộc mỗi đỉnh đều hữu hạn được gọi là Đồ thị (đa đồ thị) hữu hạn địa phương

Hiển nhiên rằng, một đồ thị hay đa đồ thị hữu hạn, thì nó cũng hữu hạn địa phương Trong các phần tiếp theo, nếu không có chú ý gì thêm, thì các đồ thị, đa đồ thị được xét đều hữu hạn

Cho YcX, Y#0; HCE,F=EN(YxY) va V= (XxX) /E

Đồ thị G,(Y,F) được gọi là đồ thị con, còn G,(X,H) là đồ thị bộ phận của đồ

thi G(X, E)

Đồ thị G’(X,V) được gọi là đồ thị bù của đồ thị G (X, E)

1.3 Biểu diễn đồ thị

1.3.1 Định nghĩa

Ma trận vuông M(n, n) chỉ gồm các phần tử 0,1 gọi là ma trận kề của đồ thị

G nếu M(¡.j ) =l © (¡.j ) là cung của G

Trang 6

Giả sử đồ thị có n đỉnh Khi đó tồn tại đường đi từ đỉnh a đến đỉnh b khi và chỉ khi tồn tại đường đi từ đỉnh a đến đỉnh b với độ dài < n -I

§2_XÍCH, CHU TRINH VA DO THI LIEN THONG

Đối với đồ thị (đa đồ thị) vô hướng có khái niệm xích (dây chuyền) và chu trình, còn đối với đồ thị (đa đồ thị) có hướng tồn tại khái niệm đường và vòng Tuy vậy, người ta vẫn dùng khái niệm đường cho cả đồ thị và đa đồ thị vô hướng

2.1 Xích, Chu trình

Giả sử G(X, E) là một đồ thị hay đa đồ thị vô hướng

Dấy (œ) các đỉnh của G(X,E): (œ)=[X,X;_ „X;X;¡; X„¡.X„]

được gọi là một xích hay một dây chuyền, nếu V ¡(1<¡ <n-1) cặp đỉnh x,„x,, kề nhau Tổng số vị trí của tất cả các cạnh xuất hiện trong xích (œ), được gọi là độ dài của xích œ và được ký hiệu bằng /œ /

Các đỉnh xạ và x„ được gọi là hai đỉnh đầu của xích (ơ) Ngoài ra còn nói rằng xích œ nối giữa các đỉnh x, và x„ Dé chỉ rõ đỉnh đầu và đỉnh cuối ta còn

ký hiệu œ bằng œ[x,„x,]

Một xích với hai đầu trùng nhau được gọi là một chu trình

Xích (chu trình) œ được gọi là xích (chu trình) đơn (sơ cấp hay cơ bản), nếu

nó đi qua mỗi cạnh (mỗi đỉnh) không quá một lần

2.2 Định nghĩa

Đối với đồ thị vô hướng có khái niệm liên thông còn đối với đồ thị có hướng

đưa ra khái niệm liên thông mạnh

Hai đỉnh x, y được gọi là hai đỉnh liên thông nêu hoặc giữa x và y có ít nhất một xích nối với nhau, hoặc tồn tại ít nhất một đường đi từ x sang y hoặc từ y sang X

Đồ thị vô hương G (X, E) được gọi là đồ thị liên thông nếu mọi cặp đỉnh của

nó đều liên thông

Đồ thị có hướng G = (X, E) được gọi là đồ thị liên thông mạnh nếu mọi cặp đỉnh của nó đều liên thông.

Trang 7

Giả sử a là đỉnh bất kỳ thuộc đồ thị G, dùng Ca để ký hiệu tập con các đỉnh của G, gồm đỉnh a và tất cả các đỉnh liên thông với a trong đồ thị G

Đồ thị con của G có tập đỉnh là Ca được gọi là một thành phần liên thông của đồ thị G

Đỉnh x trong đồ thị liên thông G được gọi là điểm khớp, nếu đồ thị con G, nhận được từ G bằng cách bỏ đỉnh x là đồ thị không liên thông Điểm khớp x

mà nó được nối với một thành phần liên thông của G, bằng đúng một cạnh, được gọi là điểm khớp đơn

Ví dụ: Cho đồ thị G có 4 thành phần liên thông

Các đồ thị con G, G; G, liên thông, đồ thị con G, liên thông mạnh

Ký hiệu S () là bậc của đỉnh ¡, m là số cung của đồ thị Khi đó tổng của SŒ)

lấy với mọi ¡ sẽ bằng 2m

Trang 8

Trong đồ thị liên thông mạnh m = n — 1 khi và chỉ khi nó không có chu trình

§3 HAM GRANDI, CHU SO VA SAC SO:

Tw dinh nghia suy ra 2 tinh chat dac trung cua ham Grandi

a) Vx,yeA, nếu yeF(x) thi g(x) # g(y)

b)Vu < g(x), uEN

3.1.2 Nhan xét

+Đồ thị có đỉnh nút không thể có hàm Grandi

+Néu F(x) tréng thi g(x)=0

+Néu x ké y thi g(x) #g(y)

+g(x) <| F(x) | (ky hiệu | | là số phần tử của tap hợp)

3.1.3 Định lý

Nếu G không có chu trình thì tồn tại duy nhất một hàm Grandi

3.1.4 Định nghĩa

Với u, v eN ta biểu diển các số đó dưới dạng nhị phân

Ug, Ug, ves Uy, Up Ves Vite «+9 Vis Vo

Có thể xem độ dài khai triển của hai số bằng nhau (nếu không thì thêm số 0

vào phía trước)

Ký hiệu w, là tổng theo mod 2 của v, và u,

Trang 9

Số w có khai triển nhị phân là w,, w,¡, , w¡, wạ gọi là d- tổng của v và u

ký hiệu là : v@u

* Nhận xét:

+ d- tổng có tính giao hoán, kết hợp

+ v@u =0 < v=u

* Khái niêm về tổng hai đồ thị

Cho hai dé thi G,(A,,F,) va G,(A,,F,)

Đồ thị G(A,F) được gọi là tổng của G, và G,, ký hiệu G,+G, trong đó

A =AxA; ( tích đề các )

(x,y)eF((a,b)) © x = a và yeF;(b) hoặc xeF;(a) và y = b

3.1.5 Định lý

Néu g, la ham Grandi cla G,, g, 1a ham Grandi cua G,

thì g(x,y)=g,(x) @g,(y) la ham Grandi cua dé thi tng ~G=G,+G,

3.2 Chu số

3.2.1 Định nghĩa

Gọi m là số cung, n là số đỉnh, p là số thành phần liên thông khi đó m — n +

p gọi là chu số của đồ thị

Trang 10

Ta nói rằng đồ thị G tô được k màu nếu tồn tại hàm f:A—>{0,1, ,k-1} sao cho nếu hai đỉnh x,y kề nhau thì f (x) # £ (y)

3.3.2 Định nghĩa

Số k gọi là sắc số của đồ thị G nếu :

a)G tô được k màu

b)G không tô được k-I màu

Giả sử đồ thị G tô được k+1 màu, đồ thị H tô được k+lI màu

Khi đó đồ thị tổng G+H tô được r+1 màu,trong đó

Cho đồ thị G (A, F) Tập BC A gọi là ổn định trong của G

nếu V x € B: BO F(x)=$ Nghia la trong B không có hai đỉnh kề nhau

Có thể xem tập rỗng là tập ổn định trong

Hiển nhiên nếu B ổn định trong thi B'` c B cũng ổn định trong.

Trang 11

bằng œ (G), nghĩa là: ơ (G)= max {|A|/A e H(G) }

Chú ý: Đối với khái niệm ổn định trong, người ta quan niệm trước hết đến

các tập ổn định trong có lực lượng cực đại, tức những tập ổn định trong có số

phần tử bằng số ổn định trong của đồ thị

Ví dụ (Gauss): Bài toán có 8 con hậu chính là một trường hợp của bài toán: Trên bàn cờnxn có thể đặt tối đa bao nhiêu con hậu ( tương tự xe, mã, tượng) để chúng không ăn lẫn nhau? Có bao nhiêu cách đặt?

Khi n = 8 số đồ thị G, có số ổn định trong bằng 8 nên chỉ có thể đặt tốiđa 8

con hậu trên bàn cờ 8 x 8, thì chúng không thể ăn lẫn nhau

Còn về cách đặt lúc đâu Gauss cho rằng có 76 cách Năm 1954 tờ báo về cờ

ở Béclin “Schaczeitung” đưa ra 40 cách, nhưng trên thực tế đồ thị G, có 92 tập

ổn định trong lực lượng bằng 8, nên có tất cả 92 cách đặt 8 con hậu trên bàn

cờ 8 x 8 để chúng không ăn lẫn nhau Đặt như 12 sơ đồ sau:

Trang 12

4.2 Tap 6n dinh ngoai

4.2.1 Dinh nghia:

Cho đồ thị G( A,F ).Tap BCA goi là ổn định ngoài cia G néu: Vx¢B:

BOF(x) # 6, néi cach khac V x ¢B: 5 y €B sao cho ye F(x)

Hién nhién néu tap B 6n dinh ngoai thi B’ > B cũng ổn định ngoài

4.2.2 Số ổn định ngoài:

Dùng P (G) để ký hiệu họ gồm tất cả các cặp ổn định ngoài của đồ thị G Định nghĩa: Số phần tử của một trong những tập ổn định ngoài có lực lượng

bé nhất được gọi là số ổn định ngoài của đồ thị G, đồng thời đượcký hiệu

bằng B (G), nghĩa là: B (G)= min {| Al/A € PG) }

Chú ý: Đối với khái niệm ổn định ngoài, người ta quan niệm trước hết đến các tập ổn định ngoài có lực lượng cực tiểu, tức những tập ổn định ngoài có số phần tử bằng số ổn định ngoài của đồ thị.

Trang 13

Ví dụ: Bài toán về 5 con hậu chính là trường hợp của bài toán:

Trên bàn cờ n x n có thể đặt tối đa bao nhiêu con hậu tương tự xe, mã, tượng,

để chúng khống chế được tất cả các ô còn lại trên bàn cờ? Có bao nhiêu cách dat?

Khi n = 8 dé thi G,, c6 s6 6n dinh ngoai B = 5, nén chi can 5 con hau b6 tri trên các ô tương ứng với một tập ổn định ngoài thì chúng sẽ khống chế được tất cả các ô trên bàn cờ

Khi n= 8 đồ thị Gụ có số ổn định ngoài B = 12, nên chỉ cần 12 con mã bố trí trên các ô tương ứng với một tập ổn định ngoài thì chúng sẽ khống chế được tất cả các ô trên bàn cờ

Khi n = 8 đồ thị G; có số ổn định ngoài B = 8, nên chỉ cần 8 con tượng bố trí trên các ô tương ứng với một tập ổn định ngoài thì chúng sẽ khống chế được tất cả các ô trên bàn cờ

Khi n = 8 đồ thị Gv có số ổn định ngoài B = 8, nên chỉ cần 8 con xe bố trí trên các ô nằm trên đường chéo thì chúng sẽ khống chế được tất cả các ô trên bàn cờ

¡) Nhân không chứa đỉnh nút

1i) Nếu F(x)=o thì x phải thuộc nhân

1i) Tập rỗng không phải là nhân

Trang 14

* Chú ý: Nêú g là hàm Grandi của đồ thị G thì tâp B={x\ g(x) = 0} là một

Chu trình đơn trong G di qua mỗi cạnh một lần được gọi là chu trình Euler

Đường đi đơn trong G đi qua mỗi cạnh của nó một lần được gọi là đường đi

Euler Đồ thị được gọi là đò thị Euler nếu nó có chu trình Euler và gọi là đồ thị nửa Euler nêu nó có đường đi Euler

5.1.2 Dinh ly (Euler)

Đồ thị vô hướng liên thông G là đồ thị Euler khi và chỉ khi mọi đỉnh của G đều có bậc chan

Trang 15

Da đồ thị liên hợp có chu trình Euler khi và chỉ khi tại mỗi đỉnh a số

cung vào bằng số cung ra

Trang 16

5.2 Đô thị Hamilton

5.2.1 Định nghĩa

Đường đi qua tất các đỉnh của đồ thị mỗi đỉnh đúng một lần được gọi là đường đi Hamilton Chu trình bắt đầu từ một đỉnh v nào đó qua tất cả các đỉnh còn lại mỗi đỉnh đúng một lần rồi quay trở về v được gọi chu trình Hamilton

Đồ thị G được gọi là đồ thị Hamilton nếu nó chứa chu trình Hamilton và gọi là

nửa Hamilton nếu nó chứa đường đi Hamilton

5.2.2 Dinh ly (Dirak)

Đơn đồ thị vô hướng G với n >2 đỉnh, mỗi đỉnh có bậc không nhỏ hơn n/2

là đồ thị Hamilton

§6 CÁC PHƯƠNG PHÁP TÌM KIẾM

6.1 Bài toán tìm kiếm

Bài toán tìm kiếm có thể phát biểu vắn tắt như sau:

- Cho một tập hợp S, mỗi phần tử s e S gọi là một trạng thái

- Với mỗi trạng thái se S_ xác định một tập cuss (s) gọi là tập kế thừa của s

- Tại mỗi thời điểm có thể đi từ trạng thái s e S đến một trong các trạng

trang thai thudc cuss (s)

- Một phần tử sạ e S gọi là trạng thái xuất phát

- Một trạng thái q € S gọi là đích

Từ trạng thái xuất phát sạ hãy tìm cách đi đến đích

6.2 Thuật toán fìm kiếm

Ký hiệu là DS là một danh sách gồm một số trạng thái

Khởi đầu cho DS = {so}

Trang 17

Dua hết trạng thái của cuss (s) vào DS

Hết vòng lặp

Thông báo không tìm thấy đích (tức là khi DS = ®)

6.3 Tìm kiếm theo chiều sâu

Nếu trong thuật toán tìm kiếm nói trên danh sách DS tổ chức theo kiểu LIFO thì ta có phương pháp tìm kiếm theo chiều sâu trước

Trong phương pháp này mỗi lần duyệt đến tận cùng mỗi nhánh rồi mới sang nhánh khác

6.4 Tìm kiếm theo chiều rộng

Nếu trong thuật toán tìm kiếm nói trên danh sách DS tổ chức theo kiểu FIFO thì ta có phương pháp tìm kiếm theo chiều rộng trước

Trong phương pháp này việc tìm kiếm có tính chất “lan dân” như hình ảnh một vết dầu loang

Trang 18

PHẦN 2: CÁC GIẢI THUẬT CỦA MỘT SỐ BÀI TOÁN CƠ

BẢN TRÊN ĐỒ THỊ

Viết bằng ngôn ngữ lập trình Pascal

PROGRAM chuong_ trinh do_ thi

mangs= array[0 1000] of string[30];

mangint= array[0 1000]of integer;

Bài toán 1 Nháp đồ thị theo danh sách cung vào một tệp văn bản

Tên các đỉnh là xâu ký tự, môi đỉnh ghỉ trên một dòng của tệp

đưa w vào tệp (đỉnh cuối của cung)

đọc tiếp w (sẽ là đỉnh đầu của cung tiếp theo)

Trang 19

write('cung ',i,':'"); write('dau: `); Readln(s);

Nếu có dinh[i] = w thì hàm cho ¡ (là số hiệu đinh w đã có)

Nếu tên đỉnh w cha có trong dãy nói trên thì

Trang 20

procedure doc tep

var i,m:integer; w:string;

Trang 21

Bài toán 3 Nhập đồ thị theo danh sách cung Xét xem có hay không một

Vì ta chỉ quan tâm đến việc có hay không một đường đi cho nên trong các

phép toán có thể thay phép + bằng | (toán tử bit “hoặc là”) và thay phép *

bằng &(toán tir bit “và”)

Nhập xp, dich

T[xp,dich]=l<© có đường từ xp đến dich

Chương trình

procedure doc _tep

Trang 22

begin

writeln('cung ',it1,':',dinh[dau[i]], >

đinh[cuoi[1]]); end;

Trang 24

nếu v[dich] = 0 thì không có đường

ngược lại in đường bằng cách sau:

cho x =dich

chừng nào x còn khác xp thì còn

k=v[x]

in x

tìm cung có đỉnh cuối = x và đỉnh đầu thuộc P(k-1)

cho x = đỉnh đầu của cung đó

in thêm đỉnh xp, độ dài đường là v[dich]

break;

end;

Trang 26

quá trình thực hiện việc gán, mảng v để lưu giá trị này

Khởi dầu cho các phần tử của v =-1(chưa gán),

V[xp] =0

Chừng nào cịn cĩ thể thì cịn duyệt các cung t 0 đến m-I nếu đỉnh đầu đã được

gán và đỉnh cuối chưa được gán, hoặc đã được gán nhưng v[cuoi] > v[dau] + độ dài cung đĩ thì gán v[cuọ] = v[dau] + độ dài cung đĩ

Néu v[dich] =-1 (cuối cung vẫn khơng được gán) thì khơng cĩ đường, ngược lại thì in đường bằng cách sau :

¡= dich

tim c là cung cĩ đỉnh cuối là ¡ và trên đĩ xảy ra đẳng thức

v[cuoi] = v[dau] + do dài cung

Trang 27

writeln('Moi nhap danh sach cung:

dinhdau ->dinhcuoi->dodai : "ngung go" /');

Khởi đầu cho các phần tử của v = 0

Chừng nào hàm THEMQ) còn cho giá trị đúng thì vòng lặp còn tiếp tục

Nếu h =n thì liên thông, ngược lại thì không liên thông

Chương trình:

Procedure tinh lien thong cua do_ thi;

function them:integer;

Trang 28

writeln(' Do thi lien thong ')

else writeln('Do thi khong lien thong');

Ngày đăng: 18/11/2014, 09:34

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