MỤC LỤC Trang Đồ thị có hướng gọi là liên thông mạnh, nếu mọi cặp đỉnh của nó đều có đường đi có hướng nối chúng với nhau...4 II.. Cây phủ thì có nhiều ứng dụng trong các bài toán điều k
Trang 2MỤC LỤC
Trang
Đồ thị có hướng gọi là liên thông mạnh, nếu mọi cặp đỉnh của nó đều có đường đi có
hướng nối chúng với nhau 4
II Cây và cây phủ 7
1 Cây 7
Chứng minh 8
2 Cây phủ 8
MỞ ĐẦU
Lý thuyết đồ thị là ngành khoa học được phát triển từ lâu nhưng lại có nhiều ứng dụng hiện đại Đồ thị là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó Đây là công cụ hữu hiệu để mô hình hoá và giải quyết các bài toán trong nhiều lĩnh vực khoa học, kỹ thuật, kinh tế, xã hội
Lý thuyết đồ thị đang được ứng dụng rộng rãi trong các lĩnh vực khoa học, kỹ thuật, kinh tế, xã hội dựa vào sự phát triển ngày càng mạnh trong năng lực tính toán của máy tính đương đại Nó là công cụ để mô hình hóa và giải quyết các bài toán tìm kiếm tối ưu trong đó các trạng thái là các đỉnh rời rạc và các tác động chuyển trạng thái được đặc trưng bằng các cạnh nối các đỉnh đó
Khi nghiên cứu bộ môn lý thuyết đồ thị, chúng ta được tiếp cận với nhiều khái niệm, tri thức mới Trong đó, một khái niệm mà chúng ta không thể không nhắc tới
đó là khái niệm về CÂY Cây là một cấu trúc dữ liệu được sử dụng rộng rãi gồm một tập hợp các đỉnh (nút) Một trong số những bài toán liên quan đến cây mà
chúng ta được tìm hiểu đó là bài toán tìm cây phủ (cây bao trùm) Đồ thị có cây phủ
là đồ thị khi ta chọn một đỉnh làm đỉnh gốc thì qua đỉnh đó luôn có một đường đi đi qua tất cả các đỉnh còn lại của đồ thị Cây phủ thì có nhiều ứng dụng trong các bài toán điều khiển giao thông, nối các mạng điện…Ngoài ra, chúng ta còn sử dụng khái niệm cây phủ để kiểm tra tính liên thông của một đồ thị
Trong thực tế có một vấn đề đặt ra là: Khi ta xây dựng các con đường thông thương giữa các thành phố, làm thế nào để chi phí bỏ ra là thấp nhất nếu ta biết trước được chi phí của con đường giữa 2 thành phố bất kỳ Từ yêu cầu thực tế này
dẫn đến bài toán “Tìm cây phủ nhỏ nhất”.
Bài toán tìm cây phủ nhỏ nhất (hay cây khung tối tiểu- Minimum Spanning Tree - MST) của một đồ thị vô hướng là một bài toán rất nổi tiếng và có ứng dụng
Trang 3rất lớn Hiện nay đã có rất nhiều thuật toán giải quyết bài toán MST trong các trường hợp cụ thể để giải quyết các bài toán thực tế Tuy nhiên hai giải thuật kinh điển để tìm cây phủ nhỏ nhất là thuật toán Prim và thuật toán Kruskal
CHƯƠNG I ĐẠI CƯƠNG VỀ ĐỒ THỊ
I Một số khái niệm
1 Đồ thị có hướng và đồ thị vô hướng
Định nghĩa 1.1: Đồ thị vô hướng G = (V, E) gồm một tập V các đỉnh và tập E
các cạnh Mỗi cạnh e ∈ E được liên kết với một cặp đỉnh v, w (không kể thứ tự) như hình sau:
Định nghĩa 1.2: Đồ thị có hướng G = (V, E) gồm một tập V các đỉnh và tập E
các cạnh có hướng gọi là cung
Mỗi cung e ∈ E được liên kết với một cặp đỉnh (v, w) có thứ tự như hình sau:
Cho đồ thị (có hướng hoặc vô hướng) G = (V, E)
Nếu cạnh e liên kết đỉnh v, w thì ta nói cạnh e liên thuộc đỉnh v, w, các đỉnh v,
w liên thuộc cạnh e, các đỉnh v, w là các đỉnh biên của cạnh e và đỉnh v kề đỉnh w.
Nếu chỉ có duy nhất một cạnh e liên kết với cặp đỉnh v, w, ta viết e=(v,w) Nếu e là cung thì v gọi là đỉnh đầu và w gọi là đỉnh cuối của cung e
2 Đường đi, chu trình, tính liên thông
Cho đồ thị G=(V, E)
Dây µ từ đỉnh v đến đỉnh w là tập hợp các đỉnh và cạnh nối tiếp nhau bắt đầu
e v
w
v
e
w
Trang 4Dây µ từ đỉnh v đến đỉnh w độ dài k được biểu diễn như sau:
µ=(v, e1, v1, e2, v2, , vk-1, ek, w).
Trong đó vi (i = 1, , k - 1) là các đỉnh trên dây ei (i = 1, , k – 1) là các cạnh trên dây liên thuộc đỉnh kề trước và sau nó Các đỉnh và cạnh trên dây có thể lặp lại
a Đường đi
Đường đi từ đỉnh v đến đỉnh w là dây từ đỉnh v đến đỉnh w, trong đó
các cạnh không lặp lại
Đường đi sơ cấp là đường đi không đi qua một đỉnh quá một lần.
Đường đi có hướng trong đồ thị có hướng là dây có hướng, trong đó các cung
không lặp lại
Đường đi có hướng sơ cấp là đường đi có hướng không đi qua một đỉnh quá
một lần
Dây có hướng trong đồ thị có hướng là dãy các đỉnh và cung nối tiếp nhau (e1,
e2, …, ek) thoả mãn đỉnh cuối của cung ei là đỉnh đầu của cung ei+1, i=1, k-1
Vòng là dây có đỉnh đầu và đỉnh cuối trùng nhau.
Vòng có hướng là dây có hướng có đỉnh đầu và đỉnh cuối trùng nhau.
b Chu trình
Chu trình là đường đi có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình có hướng là đường đi có hướng có đỉnh đầu và đỉnh cuối trùng
nhau
Chu trình sơ cấp là chu trình không đi qua một đỉnh quá 1 lần.
Chu trình có hướng sơ cấp là chu trình có hướng không đi qua một đỉnh quá
một lần
c Tính liên thông
Đồ thị vô hướng gọi là liên thông, nếu mọi cặp đỉnh của nó đều có đường đi
nối chúng với nhau
Đồ thị có hướng gọi là liên thông mạnh, nếu mọi cặp đỉnh của nó đều có
đường đi có hướng nối chúng với nhau
Đồ thị có hướng gọi là liên thông yếu, nếu đồ thị lót (vô hướng) của nó liên
thông
Đồ thị có hướng gọi là bán liên thông, nếu với mọi cặp đỉnh (u,v) bao giờ
cũng tồn tại đường đi có hướng từ u đến v hoặc từ v đến u
Đồ thị liên thông mạnh => Đồ thị bán liên thông => Đồ thị liên thông yếu.
3 Trọng đồ
Định nghĩa: Trọng đồ (có hướng) là đồ thị (có hướng) mà mỗi cạnh (cung)
của nó được gán một số
Trang 5Trọng đồ được biểu diễn bởi G = (V, E, w), trong đó V là tập các đỉnh, E là tập các cạnh (cung) và w: E -> R là hàm số trên E w(e) là trọng số của cạnh (cung)
e với mọi e ∈ E.
Trong trọng đồ độ dài trọng số của đường đi µ là tổng các trọng số trên đường đi đó
4 Đồ thị con
Cho đồ thị G = (V, E) Đồ thị G’ = (V’, E’) gọi là đồ thị con của G nếu:
V’ ⊂ V và E’ ⊂ E
Nếu V’ = V, thì G’ gọi là đồ thị con phủ của G.
5 Biểu diễn đồ thị
Để lưu trữ đồ thị và thực hiện các thuật toán khác nhau với đồ thị trên máy tính cần phải tìm những cấu trúc dữ liệu thích hợp để mô tả đồ thị Việc chọn cấu trúc dữ liệu nào để biểu diễn đồ thị có tác động rất lớn đến hiệu quả của thuật toán
Vì vậy, việc chọn lựa cấu trúc dữ liệu để biểu diễn đồ thị phụ thuộc vào từng tình huống cụ thể (bài toán và thuật toán cụ thể)
Đối với bài toán “Cây phủ nhỏ nhất” thì bài toán biểu diễn đồ thị dưới dạng:
Ma trận kề, ma trận trọng số, danh sách cạnh (cung) và danh sách kề
a Ma trận kề, ma trận trọng số của đồ thị vô hướng
Ma trận kề :
Cho đồ thị G=(V,E) có n đỉnh theo thứ tự là v1, v2, …vn Ma trân kề của đồ thị
G là ma trận vuông A=(aij)nxm trong đó aij là số cạnh (khuyên) nối vi với vj Lưu ý khi tính bậc của đỉnh mỗi khuyên được tính hai bậc
Ma trận kề của đồ thị vô hướng luôn đối xứng nhau qua đường chéo chính
Ví dụ: cho đồ thị sau
có ma trận kề là:
a
b
f e
Trang 6Ma trận trọng số
Cho đồ thị vô hướng G = (V,E) có n đỉnh theo thứ tự là v 1, v 2, …v n Ma trận
khoảng cách của G là ma trận D = (d ij) xác định như sau : dij = 0 nếu i=j
hoặc w(vi,vj) nếu (vi,vj) ∈E hoặc ∞ nếu (vi,vj) ∉E
Ma trận khoảng cách của đồ thị sau là:
b Danh sách cạnh (cung)
Trong trường hợp đồ thị thưa (đồ thị có số cạnh m thoả mãn bất đẳng thức m < 6n) người ta thường dùng cách biểu diễn đồ thị dưới dạng danh sách cạnh
Trong cách biểu diễn đồ thị bởi danh sách cạnh (cung) chúng ta sẽ lưu trữ danh sách tất cả các cạnh (cung) của đồ thị vô hướng (có hướng) Một cạnh (cung) e=(x,y) của đồ thị sẽ tương ứng với hai biến Dau[e], Cuoi[e] Như vậy , để lưu trữ
đồ thị ta cần sử dụng 2m đơn vị bộ nhớ Nhược điểm của cách biểu diễn này là để xác định những đỉnh nào của đồ thị là kề với một đỉnh cho trước chúng ta phải làm
cỡ m phép so sánh (khi duyệt qua danh sách tất cả các cạnh của đồ thị)
Ví dụ: Đồ thị sau
a
b
f e
a
b
2
6 1
f
3
6 3
Trang 7có danh sách cạnh là: (a,b),(a,c),(a,e),(b,d),(c,d),(c,e),(c,f),(d,f),(f,e) được lưu trữ bởi các mảng Đầu[e], Cuối[e], e=1, 9 như sau:
c Danh sách kề
Trong rất nhiều vấn đề ứng dụng của lý thuyết đồ thị, cách biểu diễn đồ thị dưới dạng danh sách kề là cách biểu diễn thích hợp nhất được sử dụng
Trong cách biểu diễn này, với mỗi đỉnh v của đồ thị chúng ta lưu trữ danh sách các đỉnh kề với nó, mà ta sẽ ký hiệu là :
Ke(v) = { u ∈ V | (v,u) ∈ E}
Khi đó vòng lặp thực hiện với mỗi một phần tử trong danh sách này theo thứ
tự các phần tử được sắp xếp trong nó sẽ được viết như sau:
Với mọi u ∈ Ke(v) do <công việc>.
II Cây và cây phủ
1 Cây
Cây là đồ thị liên thông không chứa chu trình
v2 v3
Gốc của cây là một đỉnh đặc biệt, thông thường là đỉnh trên cùng
Mức của đỉnh là độ dài đường đi từ gốc đến đỉnh đó
Độ cao của cây là mức lớn nhất của cây (tức mức của đỉnh cách xa cây nhất) Trong ví dụ trên nếu ta chọn v1 là gốc thì v2, v3 là những đỉnh mức 1, các đỉnh
v4, v5, v6, v7 có mức 2, và độ cao của cây là 2
Định lý
Cho T là đồ thị n đỉnh Các mệnh đề sau tương đương:
(ii) T không chứa chu trình và có n-1 cạnh
(iii) T liên thông và có n-1 cạnh
(iv) T liên thông và mỗi cạnh là cầu
(v) Hai đỉnh bất kỳ được nối với nhau bởi một đường đi duy nhất
Trang 8(vi) T không chứa chu trình và nếu thêm một cạnh nối hai đỉnh thì ta thu được
đúng 1 chu trình
(vii) T liên thông và nếu thêm một cạnh nối hai đỉnh thì ta thu được đúng 1 chu
trình
Chứng minh
Các mệnh đề trên hiển nhiên tương đương với n=1
(i)⇒(ii): Quy nạp theo số đỉnh n Giả sử đúng với mọi n ≤ k Cho n=k+1 Giả
sử e là cạnh của T Loại e khỏi T ta có đồ thị T’ gồm 2 thành phần liên thông T1 và
T2 Gọi ni , mi là số đỉnh và số cạnh tương ứng với Ti, i=1,2 Theo giả thiết quy nạp
mi = ni – 1 , i =1,2
Vậy số cạnh của T là 1+ m1 + m2 = n1 + n2 – 1 = n – 1
(ii)⇒(iii): Bằng phản chứng Giả sử T không liên thông và có k thành phần liên thông (k ≥ 2) T1, T2, , Tk Vì T không chứa chu trình nên các thành phần liên thông cũng không chứa chu trình Theo định nghĩa T1, T2, , Tk cũng là cây Gọi
ni , mi là số đỉnh và số cạnh tương ứng với Ti , i=1, ,k Theo (ii) ta có:
mi = ni – 1, i =1, ,k
Suy ra số cạnh m của T là : m = ∑ mi = ∑ (ni – 1) = n - k
mâu thuẫn với (ii) (m=n-1)
(iii)⇒(iv): Việc loại bỏ cạnh bất kỳ của T dẫn đến một đồ thị n đỉnh và n-2 cạnh Đồ thị này không thể liên thông được Vậy mỗi cạnh của T là cầu
(iv)⇒(v): Do T liên thông nên hai đỉnh bất kỳ của nó được nối với nhau bằng một dây đường đi Nếu có cặp đỉnh được nối với nhau bằng 2 đường đi thì suy ra đồ thị chứa chu trình và các cạnh trên chu trình đó không thể là cầu được, mâu thuẫn (v)⇒(vi): Hiển nhiên T không chứa chu trình Bây giờ ta thêm cạnh e=(u,v) Khi đó cạnh e cùng đường đi nối u và v tạo nên chu trình duy nhất của T
(vi)⇒(vii): Hiển nhiên
(vii)⇒(i): T liên thông Nếu T có chu trình thì khi thêm cạnh nối hai đỉnh trên chu trình ta sẽ nhận được 2 chu trình, vậy T là cây
2 Cây phủ
Định nghĩa: Cho đồ thị G=(V,E) Cây T gọi là cây phủ hay cây bao trùm của
G, nếu T là đồ thị con phủ của G
Định lý : Đồ thị G = (V, E) có cây phủ khi và chỉ khi G liên thông.
Chứng minh
(=>): Nếu G có cây phủ thì hiển nhiên G liên thông
(<=): Giả sử G là đồ thị liên thông Nếu G không có chu trình thì theo định nghĩa G là cây phủ của chính nó Nếu G có chu trình thì ta bỏ bớt 1 cạnh (không bỏ
Trang 9đỉnh) trên chu trình đó Đồ thị con thu được vẫn liên thông Nếu vẫn còn chu trình
ta lại bỏ bớt 1 cạnh, cứ tiếp tục quá trình trên cho đến khi không còn chu trình thì ta thu được cây phủ của đồ thị G
3 Khái niệm cây phủ nhỏ nhất
Cho G=(V,E, (cij)) là trọng đồ liên thông có trọng số (cij) Cây phủ T của G được gọi là cây phủ nhỏ nhất của G nếu trong số tất cả các cây phủ của G, tổng trọng số của cây T là nhỏ nhất
h
g
Trang 10CHƯƠNG II CÂY PHỦ NHỎ NHẤT
I Bài toán cây phủ nhỏ nhất
1 Bài toán thực tế
Giả sử ta muốn xây dựng một hệ thống đường sắt nối n thành phố sao cho giữa hai thành phố bất kỳ đều có thể thông thương với nhau Nếu biết trước chi phí xây dựng các tuyến đường thì bài toán đặt ra là phải xây dựng những tuyến đường nào để tổng chi phí xây dựng là ít nhất
Nếu ta coi các thành phố là đỉnh và các tuyến đường nối các thành phố là cạnh kèm theo chi phí xây dựng thì ta có trọng đồ, ví dụ như trọng đồ ở hình sau:
Khi đó bài toán quy về tìm cây phủ bé nhất của đồ thị
2 Bài toán tổng quát
Cho G(V, E, (ci j)) là trọng đồ liên thông có trọng số (ci j) Tìm cây phủ T của
G có trọng số: d(T) =
,
ij
i j E
c
∈
∑ là nhỏ nhất
3 Định lý ( Điều kiện cần và đủ)
a Phát biểu: Cho G=(V,E, (c ij )) là đồ thị liên thông có trọng số (c ij) Khi đó T
là cây phủ nhỏ nhất của G khi và chỉ khi mỗi cạnh e ∉ T có
trọng số lớn nhất trên chu trình tạo bởi e và các cạnh của T
b Chứng minh: Điều kiện cần là hiển nhiên Ta chứng minh điều kiện đủ.
Giả sử S là cây bất kỳ có k cạnh không thuộc T Ta chứng minh
d(S) ≥ d(T) qui nạp theo k
Gọi e1, e2, ,en-1 là các cạnh của T sắp theo thứ tự trọng số tăng dần
c(e1) ≤ c(e2) ≤ ≤ c(en-1) + Bước cơ sở: k=0 Hiển nhiên là d(S) = d(T) vì S=T
+ Bước qui nạp: Giả sử mọi cây với số cạnh không thuộc T ít hơn k đều có trọng số không nhỏ hơn d(T)
Gọi ei là cạnh đầu tiên trong dãy các cạnh của T không thuộc S Cạnh ei và các cạnh của S tạo thành chu trình duy nhất CS Chu trình CS bắt buộc phải chứa cạnh e ∈ S \ T
Cạnh e cùng với các cạnh của T tạo thành chu trình duy nhất CT Vì S chứa các cạnh e1, ,ei-1 và e, nên CT phải có cạnh ej với j ≥ i và ej ∉S (nếu không, CT
a
b
2
6 1
f
3
6 3
Trang 11⊂ S, vô lý) Thay cạnh e bằng cạnh ei, ta thu được cây phủ S’ có d(S’) ≤ d(S), vì c(e) ≥ c(ej) ≥ c(ei) Do S’ chỉ có k-1 cạnh không thuộc T nên theo giả thiết qui nạp d(S) ≥ d(S’) ≥ d(T)
II Các thuật toán tìm cây phủ nhỏ nhất
1 Thuật toán Prim
a Thuật toán
+ Đầu vào: Đồ thị G=(V,E) có trọng số
Các đỉnh kí hiệu là 1,2,…,n
Trọng số của cạnh (i, j), (i ,j) ∈ E, kí hiệu cij
+ Đầu ra: Cây phủ nhỏ nhất T hoặc kết luận đồ thị không liên thông
+ Các bước:
(1) Khởi tạo: T là đồ thị gồm một đỉnh 1 và không có cạnh
(2) Kiểm tra điều kiện kết thúc :
Nếu T có n - 1 cạnh , kết thúc Kết luận T là cây phủ nhỏ nhất
Ngược lại sang bước 3
(3) Thêm cạnh :
Kí hiệu M là tập : M = { (i, j) ∈ E i ∈ T & j ∉ T }
Tìm cạnh (k,h) ∈ M sao cho : ckh = min { cij (i, j) ∈ M }
Nếu ckh < ∞ , thêm cạnh (k, h) và đỉnh h vào T, sang bước 2
Ngược lại, tức M = ∅, kết thúc Kết luận đồ thị G không liên thông
b Định lý Thuật toán Prim là đúng.
Chứng minh
Cho cây phủ S bất kỳ của đồ thị G, ta phải chứng minh d(S) ≥ d(T)
Ký hiệu các đỉnh và các cạnh lần lượt được thêm vào T là v1, v2, ,vn và e1,
e2, ,en-1, trong đó ek =(vk,vk+1), k=1,2, ,n-1
Nếu các cạnh của T cũng là cạnh của S thì hiển nhiên d(S) = d(T)
Ngược lại gọi em là cạnh đầu tiên trong dãy các cạnh của T xây dựng theo thuật toán không thuộc S Cạnh em và các cạnh của S tạo thành chu trình duy nhất
C
Chu trình C chứa đỉnh vm∈Tm , trong đó Tm = {v1, ,vm} là số đỉnh có được
ở bước thêm cạnh em Chu trình C bắt buộc phải chứa cạnh e nối đỉnh của Tm với đỉnh không thuộc Tm (nếu không C⊂T) Theo thuật toán thì cạnh e có trọng số không nhỏ hơn trọng số của em Vì vậy thay cạnh e bằng cạnh em, ta thu được cây phủ S’ có d(S’) ≤ d(S) Lặp lại quá trình trên ta biến đổi cây S thành cây phủ T và suy ra d(S) ≥ d(S’) ≥ ≥ d(T)
Ví dụ 1: Áp dụng thuật toán Prim tìm cây phủ nhỏ nhất của đồ thị sau