Giáo trình Toán rời rạc
Trang 1Chương VI
ĐỒ THỊ VÀ CÂY
ồ thị là một chủ đề đã cũ nhưng lại có rất nhiều ứng dụng trong các ngành khoa học hiện đại và được dùng để giải rất nhiều lớp bài toán khác nhau Đặc biệt là trong công nghệ thông tin lý thuyết đồ thị có một vai trò rất quan trọng trong việc xác định các kết nối trên mạng máy tính, tối ưu hóa đường truyền dữ liệu cũng như tối ưu hóa bản thân dữ liệu được trao đổi giữa các máy tính , v.v
Đ
Trong chương trước chúng ta đã nghiên cứu một số khái niệm đầu tiên về đồ thị, chương này cung cấp cho chúng ta thêm một số khái niệm và tính chất thường dùng để giải các bài toán có áp dụng lí thuyết đồ thị Cũng cần lưu ý là nếu không có chỉ định gì đặc biệt thì đồ thị nói trong chương này là đồ thị vô hướng
I ĐỒ THỊ
Định nghĩa: Bậc của một đỉnh trong một đồ thị là số cạnh tới nối với đỉnh này.
Ví dụ:
Các đỉnh cô lập A, D có bậc 0
Bậc của đỉnh F là 3 Bậc của đỉnh B là 4 (Bậc của đỉnh có vòng được cộng thêm 2 cho mỗi vòng)
Bậc của đỉnh G là 1 Đỉnh bậc 1 gọi là đỉnh treo và cạnh tới tương ứng gọi là cạnh treo.
Bổ đề 1: Trong một đồ thị thì tổng bậc các đỉnh bằng hai lần số cạnh.
Chứng minh
Vì mỗi cạnh được tính cho 2 đỉnh có bậc khác 0
QED
Ví dụ: Có bao nhiêu cạnh trong đồ thị (vô hướng) có 10 đỉnh đều có bậc là 6? Giải: Tổng bậc tất cả các đỉnh là 6*10 = 60 nên suy ra đồ thị có tất cả 30 cạnh Bổ đề 2: Số các đỉnh bậc lẻ là số chẵn.
Chứng minh
Tổng bậc các đỉnh bậc lẻ+Tổng bậc các đỉnh bậc chẵn = 2 * số cạnh
Suy ra tổng bậc các đỉnh bậc lẻ là chẳn
Định nghĩa: Một đồ thị gọi là đồ thị đơn nếu không có cặp đỉnh nào được nối với nhau
bằng quá một cạnh
Trang 2A D A B
C
Một số kiểu đồ thị đơn đặc biệt:
Định nghĩa: Một đồ thị đơn n đỉnh gọi là đồ thị hoàn chỉnh, kí hiệu Kn, nếu nó là một đồ thị đơn và chứa đúng một cạnh giữa mỗi cặp đỉnh phân biệt
Định nghĩa: Một đồ thị đơn gọi là đồ thị phân đôi nếu tập V các đỉnh của nó có thể phân
thành hai tập con không rỗng V1 và V2 rời nhau sao cho mọi cạnh trong đồ thị đều nối một đỉnh của V1 và một đỉnh của V2 (Không có cạnh nào nối hai đỉnh trong V1 hoặc hai đỉnh trong V2 với nhau)
Các đồ thị phân đôi
Định nghĩa: Đồ thị đơn gọi là phân đôi hoàn chỉnh, kí hiệu Km,n, nếu tập các đỉnh V của nó có thể phân thành hai tập con V1 và V2 lần lượt có m đỉnh và n đỉnh và mỗi đỉnh trong tập con này đều được nối với mọi đỉnh trong tập con kia
Ứng dụng của đồ thị trong công nghệ thông tin:
Mạng cục bộ (LAN - Local Area Network): Nhiều máy tính và các thiết bị ngoại vi đi
kèm đặt trong một tòa nhà có thể được nối với nhau thành một mạng gọi là mạng cục bộ Cấu
V2
V1
Trang 3trúc cách thức nối các máy tính này với nhau gọi là topology mạng Một topology mạng là một kiểu đồ thị mà mỗi đỉnh là một máy tính còn các cạnh là các đường truyền (cable đồng trục / cable UTP / cable quang / vô tuyến)
Topology tuyến tính: Các máy tính được nối với nhau thành một đường Thông thường các đường truyền là coaxial thin cable (10BASE-2) hoặc coaxial thick cable sử dụng các đầu nối chữ T (T-connector)
Topology hình sao: Các máy tính được nối với nhau thành một đồ thị phân đôi hoàn chỉnh K1,n Đường truyền thường dùng cable UTP 10BASE-T với các đầu nối 10BASE-T RJ-45 và sử dụng hộp tập trung cable (gọi là HUB)
Topology vòng: Các máy tính được nối với nhau thành một chu trình không tự cắt Server là một trong các đỉnh của đồ thị Trong cấu hình Token ring, server gởi một tín hiệu, gọi là cờ (flag) luân chuyển trong MAU (Media Access Unit) mạng Workstation nào nhận được cờ này sẽ được quyền thu phát tín hiệu Topology này thường được dùng trong các hệ thống thời gian thực (real time system)
Ngoài ra có thể dùng cấu trúc hỗn hợp giữa các cấu trúc này:
Trang 4Xử lí song song (parallel processing) : Máy tính đơn sử dụng một CPU hoạt động theo
nguyên lí Von Neumann Nghĩa là tại mỗi thời điểm chỉ có một chỉ thị máy được CPU xử lí và các chỉ thị này được xử lí tuần tự hết chỉ thị này đến các chỉ thị khác Khi máy tính hoạt động theo chế độ đa nhiệm (multitasking) thì CPU thực hiện chế độ xắt lát thời gian (time slicing) và kỹ thuật đường ống (pipeline) để giải quyết các yêu cầu ngắt dày đặt của các chương trình1 Nếu có quá nhiều chương trình tranh chấp nhau thời gian CPU sẽ xảy ra tình trạng “thắt cổ chai” và hệ thống máy tính sẽ chạy chậm đi (slow down) đáng kể Để giải quyết kịp thời các yêu cầu này hoặc là phải tăng xung nhịp của CPU (tăng tốc độ xử lí) hoặc là phải tăng số bộ
xử lí lên Nếu có nhiều bộ xử lí thì các giải thuật song song sẽ phân chia bài toán cần giải
quyết ra thành nhiều bài toán con để có thể giải đồng thời Các bài toán con này sẽ được gởi đến cho các bộ xử lí khác nhau để xử lí riêng rẽ Khi tất cả các bài toán con đã được xử lí xong thì một kết quả tổng hợp sẽ được thực hiện
Ví dụ: Một đoạn mã giả thể hiện giải thuật có sử dụng quá trình xử lí song song các
phát biểu statement_1, statement_2, , statement_n
cobegin
statement_1;
statement_2;
statement_n;
coend
Statement_m
Ví dụ: Thực hiện đoạn chương trình2:
x := a - c*d + e
y := b + d/a
z := x + e*y Xử lí trên máy tính tuần tự (một bộ xử lí) cần 7 bước:
Xử lí trên máy tính xử lí song song chỉ cần 4 bước:
1 Đề nghị người đọc xem lại các tài liệu về hệ điều hành và chế độ đa nhiệm.
2 An Introduction to Operating Systems - Harvey M Deitel -Addison Wesley-1990 - pp 319,340
Trong đoạn chương trình này các công việc được khai báo giữa cobegin và coend
(statement_1,statement_2, ,statement_n) sẽ được thực hiện đồng thời trên các CPU khác nhau Khi đã thực hiện xong tất cả các công việc đó statement_m sẽ được thi hành.
Trang 5Khi xử lí song song, dữ liệu đầu vào của bộ xử lí này có thể chính là dữ liệu đầu ra của bộ xử lí kia Do đó các bộ xử lí cần phải được liên kết với nhau theo một sơ đồ cấu trúc nào đó
Cách liên kết đơn giản nhất là liên kết hai chiều giữa từng cặp bộ xử lí tạo thành một đồ thị hoàn chỉnh Kn Tuy nhiên như vậy thì số liên kết sẽ bùng nổ quá nhiều theo số bộ xử lí Với máy tính n bộ xử lí cần đến: (n-1)+(n-2)+ +1 = (n/2)(n-1) liên kết giữa các CPU
Có thể liên kết các bộ xử lí theo đường thẳng: Mỗi bộ xử lí Pi (i≠1 và i≠n) được nối
với hai bộ xử lí kế bên Pi-1 và Pi+1 Nhưng như vậy thì cần các bước xử lí trung gian khi Pi chia sẽ dữ liệu với các Pj (Pj≠Pi-1 và Pj≠Pi+1)
Người ta dùng phổ biến cách liên kết theo mảng hai chiều, trong đó số bộ xử lí N là một số chính phương Các bộ xử lí được đánh thứ tự Pi,j trong đó i và j chạy từ 1 đến m (m =
2 N ) Mỗi Pi,j liên kết với 4 bộ xử lí láng giềng Pi+1,j, Pi-1,j, Pi,j+1 và Pi,j-1 trừ các bộ xử lí ở ngoại
vi Các liên kết có thể có được minh họa như trong đồ thị sau:
P1,1
Pm,m
Đường đi Euler và đường đi Hamilton:
Định nghĩa: Đường là một đồ thị G = <V,E,I> mà quan hệ tới I có tính chất nối đuôi3 Tính chất nối đuôi của I có thể được biểu diễn dưới dạng:
I = { (A1,y1,A2); (A2,y2,A3); ;(An-2,yn-2,An-1); (An-1,yn-1,An) } ⊆VxExV
3 Lưu ý rằng đường có thể là đồ thị con của một đồ thị khác.
Trong bước 1 các phép toán +,* và / được xử lí song song
Trong bước 2 các phép toán - và + được xử lí song song
Trang 6Nói cách khác đường là một chuỗi cạnh nối tiếp nhau
Ta kí hiệu đường bằng chuỗi đỉnh được nối với nhau bởi đường
Đường không tự cắt là một đường có 2 đỉnh bậc 1 và mọi đỉnh còn lại đều có bậc 2
Ví dụ:
Đường DCB là đường không tự cắt
Đường ACBCD là đường tự cắt
Định nghĩa: Đường đi gọi là đơn nếu nó không chứa cạnh nào quá 1 lần.
Khái niệm liên thông:
Đồ thị liên thông là đồ thị mà mọi cặp đỉnh đều có đường nối Đồ thị không liên thông được gọi là đồ thị rời rạc
Ví dụ:
G1 là đồ thị liên thông còn G2
là đồ thị rời rạc
Khái niệm chu trình:
Định nghĩa: Chu trình là một đường có mọi đỉnh đều bậc chẵn Chiều dài của chu trình
là số cạnh của chu trình Chu trình gọi là đơn nếu nó không chứa cạnh nào quá một lần
Ví dụ:
Trong đồ thị G3 thì đường ACDFEA là một chu trình không tự cắt có chiều dài 5
Trong đồ thị G4 thì ADCBCA là một chu trình tự cắt
Hệ quả: Nếu một chu trình không tự cắt thì mọi đỉnh đều có bậc 2
Hệ quả: Chu trình là chu trình đơn nếu mọi đỉnh của nó đều bậc chẳn
Định nghĩa: Đường đi Euler trong đồ thị G là đường đi đơn chứa tất cả các cạnh của G
Chu trình Euler trong G là chu trình đơn chứa tất cả các cạnh của G
Định lí:
Một đa đồ thị liên thông sẽ có chu trình Euler nếu và chỉ nếu tất cả các đỉnh của nó đều có bậc chẳn
Ta chấp nhận định lí này
Trang 7Giải thuật tìm chu trình Euler (Giải thuật Fleury):
Ví dụ: Tìm chu trình Euler cho đồ thị:
Bước 0: Ma trận kề cho đồ thị trên là:
M =
0 1 1 0 0 0
1 0 1 1 1 0
1 1 0 1 1 0
0 1 1 0 1 1
0 1 1 1 0 1
0 0 0 1 1 0
Bước 1: Giả sử ta chọn đỉnh (xuất phát) là đỉnh A
Bước 2: Chọn đỉnh có chỉ số nhỏ nhất trong các đỉnh có chỉ số lớn hơn A có cạnh nối với
A (bằng không chọn đỉnh có chỉ số nhỏ nhất có cạnh nối với A) Trong trường hợp này là B, thay đổi giá trị tại các vị trí có tọa độ (A,B) và (B,A) thành 0
M =
0 0 1 0 0 0
0 0 1 1 1 0
1 1 0 1 1 0
0 1 1 0 1 1
0 1 1 1 0 1
0 0 0 1 1 0
Bước 3: Ghi nhận B Ghi nhận đường d=AB
Bước 4: Đỉnh bây giờ là B
Bước 5: Ma trận khác ma trận 0? Nếu chưa quay lại bước 2, bằng không qua bước 6 Bước 6: Thông báo đường (chu trình Euler) d Qua bước 7
Bước 7: Kết thúc
Thực hiện giải thuật trên ta có dãy các ma trận là (để cho dễ theo dõi các chổ thay thế
0 bằng 1 sẽ được ghi bàng dấu “.”):
0 1 1 0 0 0
1 0 1 1 1 0
1 1 0 1 1 0
0 1 1 0 1 1
0 1 1 1 0 1
0 0 0 1 1 0
0 1 0 0 0 0 1 1 1 0
1 1 0 1 1 0
0 1 1 0 1 1
0 1 1 1 0 1
0 0 0 1 1 0
0 1 0 0 0 0 1 1 0
1 0 1 1 0
0 1 1 0 1 1
0 1 1 1 0 1
0 0 0 1 1 0
Trang 8A B C
0 1 0 0 0
0 1 1 0
1 0 1 0
0 1 0 1 1
0 1 1 1 0 1
0 0 0 1 1 0
0 1 0 0 0 0 1 1 0
1 0 1 0
0 1 0 1
0 1 1 0 1
0 0 0 1 1 0
0 1 0 0 0 0 1 1 0
1 0 1 0
0 1 0 1
0 1 1 0
0 0 0 1 0
0 1 0 0 0
0 1 1 0
1 0 1 0
0 1 0
0 1 1 0
0 0 0 0
0 1 0 0 0 0 1 0
1 0 1 0
0 0
0 1 1 0
0 0 0 0
0 1 0 0 0 0 0
1 0 1 0
0 0
0 1 0
0 0 0 0
0 1 0 0 0
0 0
1 0 0
0 0
0 0
0 0 0 0
0 0 0 0 0 0 0 0
0 0
0 0
0 0 0 0
Kết quả thực hiện thuật toán trên là: ABCDEFDBECA
o Đồ thị phẳng
Định nghĩa 1: Một đồ thị gọi là phẳng nếu ta có thể vẽ nó trong một mặt phẳng và không có cạnh nào cắt nhau trừ tại các đỉnh.
Ví dụ:
Các đồ thị sau đây là phẳng vì ta có thể vẽ lại nó mà không có cạnh nào cắt nhau:
Trang 9Sau khi vẽ lại:
Đồ thị sau đây (K5) không thể là đồ thị phẳng được:
C
D
E
Trang 10Vấn đề xác minh một đồ thị có phải là phẳng hay không rất quan trọng trong việc thiết
kế các mạch in Trên các mạch như vậy các đường nối các chân linh kiện (đỉnh) không thể cắt nhau được Do đó một tiêu chuẩn nhận biết một đồ thị có là đồ thị phẳng hay không là rất cần thiết
Ta thấy rằng nếu một đồ thị có thể vẽ lại thành đồ thị phẳng thì đồ thị phẳng đó chia mặt phẳng ra làm các miền, bao gồm các miền bên trong đồ thị và miền bên ngoài Trong đồ thị phẳng bên đây ta có các miền f1, f2, f3, f4 Chú ý rằng ta luôn có một và chỉ một miền bên ngoài (trong hình này là miền f4)
o Công thức Euler và định lý Kuratowski :
Nhà toán học Euler đã chứng minh rằng một đồ thị phẳng dù được biểu diễn phẳng bằng cách nào đi nữa thì số miền chia là một hằng số
Định lý:
Cho G là một đồ thị đơn, phẳng, liên thông có e cạnh và v đỉnh Gọi f là số miền trong biểu diễn phẳng của G thì: f = e - v + 2. (*)
Chứng minh:
Ta sẽ xây dựng biểu diễn phẳng của G lần lượt từng cạnh một thành một dãy các đồ thị con phẳng Gi của G Việc bổ sung lần lượt từng cạnh một như thế được định nghĩa đệ qui như sau:
Nếu n = 1 thì Gn là một cạnh bất kì của G, ngoài ra ta xây dựng Gn+1 từ Gn bằng cách bổ sung vào Gn một cạnh mới liên thuộc với Gn và một đỉnh mới liên thuộc với cạnh mới đó nếu như chưa có cạnh mới này trong Gn Làm được như vậy vì G là một đồ thị liên thông Ta sẽ nhận được G khi đạt được Ge Với mỗi Gn ta gọi fn, en, vn là số miền, số cạnh và số đỉnh tương ứng
Ta chứng minh công thức trên bằng cách truy chứng theo n:
n = 1
Đồ thị con G1 có v1=2, e1=1 và chỉ chia mặt phẳng ra làm một miền f1 = 1 Công thức (*) đã thỏa cho trường hợp n=1
Giả sử công thức (*) đã được chứng minh cho trường hợp Gn (tức là đã xây dựng được tới Gn, ta có fn = en - vn +2)
Trang 11Cho (an+1,bn+1
) là cạnh xác định bởi hai đỉnh an+1
và bn+1
cần được bổ sung vào Gn để được Gn+1 Theo cách xây dựng Gn+1 nói trên, một trong hai đỉnh này phải thuộc Gn, giả sử đó là an+1 Chỉ có hai khả năng xảy ra:
an+1 và bn+1 đều là đỉnh sẳn có trong Gn: Khi đó cả an+1 và bn+1 đều phải cùng nằm trên biên của một miền đã được chia bởi Gn (bằng không cạnh mới này sẽ cắt ít nhất một trong các cạnh sẳn có!) Cạnh nối bởi an+1 và bn+1 phải làm tăng thêm một miền trong thuộc miền trong của Gn hoặc làm tăng thêm một miền trong trước kia vốn thuộc miền ngoài của Gn nhưng lại không làm tăng số đỉnh Trong cả hai trường hợp này:
fn+1 = fn+1 = (en - vn + 2) + 1
= (en+1) - vn+1 + 2
= (en+1) - vn+1 + 2
bn+1 không thuộc Gn Vậy bn+1 phải ở trong một miền trong đã xác định bởi Gn hoặc ở miền ngoài của
Gn Trong cả hai trường hợp đã làm tăng số cạnh lên 1 đồng thời cũng làm tăng số đỉnh lên 1 nhưng không làm tăng số mặt, ie:
fn+1 = fn = (en +1) - (vn+1) + 2
= (en+1) - vn+1 +2
Vậy công thức (*) cũng đúng cho trường hợp (n+1) Theo nguyên lí truy chứng công thức Euler đã được chứng minh cho mọi giá trị n nguyên dương Nhưng Ge chính là G nên công thức đã được chứng minh cho G
Hệ quả 1: Nếu G là một đồ thị phẳng , liên thông có e cạnh, v đỉnh (v ≥ 3) thì: e ≤ 3v-6 (**)
Chứng minh:
Giả sử G chia mặt phẳng ra làm f miền Vì G là đồ thị đơn nên mỗi miền phải được giới hạn bởi ít nhất 3 cạnh (kể cả miền ngoài) và vì mỗi cạnh phải xuất hiện đúng hai lần trên biên của hai miền khác nhau nên:
2e ≥ 3f (1) Từ (1) và e -v +2 = f suy ra e - v +2 ≤ (2/3) e Hay : 3e -3v+6 ≤ 2e
Vậy: e ≤ 3v-6
QED
Trang 12Ví dụ: Đồ thị K5 có 5 đỉnh và 10 cạnh nên không thỏa bất đẳng thức (**) Suy ra K5
không phải là một đồ thị phẳng
Hệ quả 2: Nếu G là một đồ thị đơn, liên thông có e cạnh và v đỉnh (v ≥ 3), không có chu trình độ dài 3 thì e ≤ 2v -4 (***)
Chứng minh:
Nhận xét rằng vì G không có chu trình nào độ dài 3 nên mỗi miền phải được giới hạn bởi ít nhất 4 cạnh (kể cả miền ngoài) Phần còn lại của chứng tương tự trong chứng minh của hệ quả trên
QED
Ví dụ: Đồ thị K3,3 có 6 đỉnh và 9 cạnh (là đồ thị phân đôi nên không thể có chu trình độ
dài 3) nên không thỏa bất đẳng thức (***) Suy ra K3,3 không phải là một đồ thị phẳng
Công thức Euler và các hệ quả nêu trên chỉ cho chúng ta điều kiện cần để một đồ thị là phẳng mà thôi Điều đó cũng có nghĩa là chúng ta có một điều kiện đủ để xác minh một đồ thị là không phẳng Việc chứng minh một đồ thị là phẳng là việc hết sức khó khăn Tuy nhiên chúng ta có một nhận xét sau:
“Nếu một đồ thị là phẳng thì mọi đồ thị nhận được từ đồ thị đó bằng cách bỏ đi cạnh (a,b) đồng thời thêm vào đỉnh mới c và hai cạnh (a,c), (c,b) cũng là đồ thị phẳng”
Phép toán như vậy gọi là phép phân chia sơ cấp Hai đồ thị G1 và G2 nhận được từ cùng một đồ thị G sau một loạt các phép
phân chia sơ cấp gọi là đồng phôi Rõ ràng
hai đồ thị G1 và G2 “sinh đôi” từ một “trứng”
G như vậy hoặc là cùng phẳng hoặc cùng không phẳng (như G) Hơn nữa, khi G chứa một đồ thị con như K3,3 hoặc K5 thì “gien” này đủ xác định rằng G1 và G2 là không phẳng4
Một đồ thị là không phẳng nếu và chỉ nếu nó có chứa một đồ thị con đồng phôi
với K3,3 hoặc K5
Ví dụ:
Đồ thị Petersen sau đây có phải là một đồ thị phẳng hay không?
4 Do sự phức tạp của chứng minh điều ngược lại: “Mọi đồ thị không phẳng đều chứa một đồ thị con đồng phôi với K3,3 hoặc K5” nên không nêu lên chứng minh đó ở đây.