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

Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị

72 676 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 72
Dung lượng 1,16 MB

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

Nội dung

Trên đồ thị có hướng, tổng bán bậc ra của tất cả các đỉnh bằng tổng bán vào của tất cả các đỉnh.+ Hai đỉnh liên thông Đỉnh p và q được gọi là liên thông với nhau trên đồ thị G nếu có một

Trang 2

MỞ ĐẦU

1 Lý do chọn đề tài

Ngày nay công nghệ thông tin đã xâm nhập sâu rộng vào mọi lĩnh vực củađời sống xã hội, trở thành một công cụ không thể thiếu của các nhà khoa học,cán bộ chuyên môn Sự phát triển kỳ diệu của máy tính gắn liền với sự pháttriển toán học hiện đại, trong đó lý thuyết đồ thị là một bộ phận quan trọng vớinhiều ứng dụng hữu ích và được nghiên cứu nhiều nhất

Toán rời rạc nói chung và lý thuyết đồ thị nói riêng là công cụ thiết yếucho nhiều ngành khoa học kỹ thuật và là một nội dung quan trọng trong chươngtrình đào tạo sinh viên các ngành CNTT Lý thuyết đồ thị, với cách tiếp cận đốitượng nghiên cứu và phương pháp tư duy khá độc đáo thực sự ngày càng hữuích có nhiều ứng dụng phong phú Máy tính mà bản thân nó với các quá trìnhlàm việc mang tính rời rạc, nên điều này tương hợp gắn chặt lý thuyết đồ thị vớicông nghệ máy tính trong việc nghiên cứu các đối tượng có tính chất rời rạc.Tin học là công cụ đắc lực, là lĩnh vực có nhiều ứng dụng phục vụ chonhiều ngành khác nhau trong đời sống xã hội Cho nên việc nghiên cứu các vấn

đề ứng dụng cho tin học cũng là việc nghiên cứu các ứng dụng được giải quyếtnhư thế nào trên máy tính Có nhiều bài toán ứng dụng, nếu được mô hình hoábằng đồ thị thì sẽ dễ dàng giải quyết được trên máy tính, vì cấu trúc và quátrình xử lý lữu trữ thông tin trên máy tính có tính chất rời rạc không liên tục

Đồ thị đóng vai trò quan trọng làm cơ sở toán cho tin học, ứng dụng của

đồ thị là rất thực tiễn và quan trọng, việc nghiên cứu lý thuyết đồ thị và các ứngdụng của nó góp phần phát triển các kỹ thuật Tin học, đặc biệt trong khâu lậptrình Vì những lý do trên tôi quyết định chọn đề tài nghiên cứu “Xây dựngchương trình hỗ trợ giảng dạy Lý thuyết đồ thị”

2 Mục tiêu đề tài

Xây dựng phần mềm máy tính giải các bài toán điển hình về đồ thị để hỗtrợ cho giảng viên Tin học giảng dạy các nội dung của học phần Lý thuyết đồthị

Trang 3

3 Đối tượng, phạm vi nghiên cứu

3.1 Đối tượng nghiên cứu

- Lý thuyết đồ thị và thuật toán điển hình

- Ngôn ngữ lập trình máy tính

3.2 Phạm vi nghiên cứu

- Nội dung học phần Lý thuyết đồ thị hiện đang giảng dạy tại các lớpCNTT ở trường ĐH Hùng Vương

4 Phương pháp nghiên cứu

Phương pháp nghiên cứu lý luận

Phương pháp tổng kết kinh nghiệm

Phương pháp lấy ý kiến chuyên gia

Trang 4

PHẦN 1: LÝ THUYẾT ĐỒ THỊ CHƯƠNG 1: ĐẠI CƯƠNG VỀ ĐỒ THỊ 1.1 Khái niệm

1.1.1 Đồ thị

Khái niệm đồ thị

Một đồ thị G(V,E) bao gồm một tập hợp hữu hạn V các nút (đỉnh,

vertices) và một tập hợp hữu hạn E các cặp đỉnh gọi là cung (cạnh, edges)

Hình 1.1 Mô hình hóa bản đồ địa lý bằng đồ thị

1.1.2 Các dạng đồ thị

- Các đặc điểm của cạnh để phân biệt các dạng đồ thị cụ thể:

+ Cạnh e1 = (u,v) và cạnh e2 = (t,k) trên đồ thị G gọi là cạnh lặp nếu u ≡ t

và v ≡ k

+ Các cạnh e thuộc E được gọi là có hướng nếu thứ tự hai đỉnh trên một cạnh trên đồ thị G được quan tâm tới: phân biệt hai cạnh e1 = (u,v) và e2 = (v,u)

- Từ đó có các dạng đồ thị cơ bản:

Trang 5

Tồn tại cạnh lặp Không tồn tại cạnh lặpCạnh có hướng Đa đồ thị có

hướng

Đơn đồ thị có hướng

Cạnh vô hướng Đa đồ thị vô

hướng

Đơn đồ thị vô hướng

Môn học này sẽ làm việc với đơn đồ thị có hướng và đơn đồ thị vô

hướng Do đó trong các nội dung trình bày ở các phần sau sẽ nói tắt “đồ thị” thay cho “đơn đồ thị”

- Một số dạng đơn đồ thị vô hướng đặc biệt:

+ Đồ thị đầy đủ Kn

Là đơn đồ thị vô hướng mà giữa hai đỉnh bất kì của nó luôn tồn tại cạnh nối.

+ Đồ thị vòng Cn

Trang 6

Là đơn đồ thị vô hướng G = (V,E) với tập đỉnh V = {1, 2, 3, , n} và tập cạnh E = {(1,2); (2,3); (3,4); ; (n-1,n); (n,1)}.

Hình 1.2 Các đồ thị K n , C n và W n và K 4,3

+ Đồ thị bánh xe Wn

Là đơn đồ thị vô hướng thu được từ đồ thị C n-1 bằng cách thêm một đỉnh

n nối với n-1 đỉnh của đồ thị C n-1

Trang 7

1.1.3 Các khái niệm liên quan

- Cho đồ thị G = (V, E): V = {1, 2, , n} và E = {e1, e2, , em} Cáckhái niệm được trình bày dưới đây có thể dùng cho cả đồ thị có hướng và vôhướng hoặc từng dạng đồ thị cụ thể

+ Đồ thị có trọng số Đồ thị G = (V,E) là đồ thị có trọng số nếu xây dựng mộtđơn ánh từ E đến R gán cho mỗi cạnh thuộc E một số thực đặc trưng cho cạnh

đó và được gọi là trọng số của cạnh

+ Cạnh

Nếu (u, v) là một cặp đỉnh thuộc E thì nói có một cạnh nối u và v Khi đó

v được gọi là kề của u

▪ Nếu G là đồ thị vô hướng, cạnh (u,v) được gọi là liên thuộc vớihai đỉnh u và v

▪ Nếu G là đồ thị có hướng, cạnh (u,v) được gọi là đi ra từ đỉnh u

Trang 8

Trên đồ thị có hướng, tổng bán bậc ra của tất cả các đỉnh bằng tổng bán vào của tất cả các đỉnh.

+ Hai đỉnh liên thông

Đỉnh p và q được gọi là liên thông với nhau trên đồ thị G nếu có một đường đi từ p đến q trên đồ thị đó.

+ Đỉnh rẽ nhánh

Đỉnh u được gọi là đỉnh rẽ nhánh của đồ thị G nếu việc loại bỏ đỉnh đó

Trang 9

+ Cầu

Cạnh e được gọi là cầu của đồ thị G nếu việc loại bỏ cạnh đó làm tăng

số thành phần liên thông của đồ thị.

+ Ma trận kề A biểu diễn G là một ma trận vuông nxn có các phần

tử nhận giá trị 0 hoặc 1: aij = 1 nếu tồn tại một cung định hướng từ vi đến vj

- Cách biểu diễn bằng ma trận kề có thể dùng cho cả đồ thị có hướng và

vô hướng Dễ thấy ma trận biểu diễn đồ thị vô hướng đối xứng qua đường chéochính

- Nếu đồ thị là có trọng số thì các phần tử ma trận kề có thể nhận giá trị

là trọng số của cung

- Có thể lựa chọn hai giá trị 0 và 1 để phân biệt sự khác nhau giữa cặpđỉnh có cạnh nối và cặp đỉnh không có cạnh nối Trong thực tế cài đặt, tùythuộc vào thuật toán mà có thể sử dụng các bộ giá trị khác vẫn đảm bảo sự phânbiệt

- Ưu điểm:

+ Tốc độ truy xuất thông tin về cạnh cao

- Nhược điểm:

+ Đồ thị thưa có hiệu suất sử dụng tài nguyên thấp

+ Tình huống cập nhật đồ thị bằng thao tác thay đổi kích thước tậpđỉnh rất phức tạp: buộc phải khai báo một ma trận với kích thước mới và hủy

bỏ ma trận đã sử dụng ban đầu

Trang 10

i aij = 1 nếu đỉnh i là đỉnh đầu của cạnh ej.

ii aij = -1 nếu đỉnh i là đỉnh cuối của cạnh ej.iii aij = 0 nếu đỉnh i không là đầu mút của cạnh ej

- Cách biểu diễn bằng ma trận liên thuộc chủ yếu được dùng để biểu diễn

đồ thị có hướng

- Có thể lựa chọn ba giá trị 0, 1 và -1 để phân biệt sự khác nhau giữa đỉnh

i và cạnh ej Trong thực tế cài đặt, tùy thuộc vào thuật toán mà có thể sử dụngcác bộ giá trị khác vẫn đảm bảo sự phân biệt

- Ưu điểm:

+ Tốc độ truy xuất thông tin về cạnh nhanh

+ Các cạnh được sắp xếp tuyến tính hỗ trợ tốt cho các thuật toányêu cầu quá trình duyệt lần lượt các cạnh

- Nhược điểm:

+ Tài nguyên bộ nhớ quá tốn kém

+ Tình huống cập nhật đồ thị bằng thao tác thay đổi kích thước tậpđỉnh hoặc tập cạnh rất phức tạp: buộc phải khai báo một ma trận với kích thướcmới và hủy bỏ ma trận đã sử dụng ban đầu

1.2.3 Danh sách cạnh

- Cách biểu diễn đồ thị bằng danh sách cạnh:

+ Đánh số các đỉnh thuộc V từ 1 → n

+ Đánh số các cạnh thuộc E từ 1 → m

Trang 11

+ Thực hiện lưu trữ đồ thị G bằng cách lưu trữ thông tin về cáccạnh: đỉnh đầu, đỉnh cuối và trọng số(nếu có).

- Danh sách sử dụng để lưu trữ có thể là danh sách tuyến tính (sử dụngcấu trúc mảng) hoặc danh sách liên kết

số cạnh của đồ thị mà không bị mất mát thông tin

1.3 Đồ thị phẳng

1.3.1 Khái niệm

Đồ thị phẳng

Trang 12

Đồ thị phẳng là đồ thị có thể được biểu diễn trên mặt phẳng sao cho các cạnh không cắt nhau ở ngoài đỉnh.

Trang 13

CHƯƠNG 2: CÁC BÀI TOÁN VỀ ĐƯỜNG ĐI 2.1 Đồ thị Euler

2.1.1 Khái niệm

+ Đường đi và 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 Đường đi Euler có đỉnh đầu và đỉnh cuối trùng nhau gọi là chu trình Euler.

+ Đồ thị Euler và nửa Euler

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

4

1 3

Trang 14

Hình 2.1 Đồ thị Euler và nửa Euler

2.1.2 Thuật toán tìm chu trình Euler

- Cho đồ thị Euler G = (V,E) được biểu diễn bởi danh sách kề ke(u)

- Trong quá trình thực hiện thuật toán sử dụng STACK để lưu các đỉnh đang xét và CE để lưu chu trình Euler được xây dựng

- Giả mã thuật toán xây dựng chu trình Euler trên đồ thị G:

Giả mã 2.2 BUILD_EULER_CYCLE

- Thuật toán bằng tay xác định chu trình Euler trên đồ thị Euler: xuất phát

từ 1 đỉnh u nào đó của đồ thị Euler G, ta đi theo các cạnh của nó một cách tùy ýnhưng tuân thủ 2 qui tắc sau:

+ Xóa bỏ cạnh đã đi qua và xóa những đỉnh cô lập được tạo thành

procedure BUILD_EULER_CYCLE begin

x ← STACK;

if ke(x) != Ø then begin

y := đỉnh đầu của ke(x);

STACK ← y;

ke(x) := ke(x) \ {y};

ke(y) := ke(y) \ {x};

end else begin

x ← STACK;

CE ← x;

end end

end

Trang 15

+ Ở mỗi bước chỉ đi qua cầu khi không còn lựa chọn nào khác.

2.2 Tìm đường đi trong mê cung

2.2.1 Bài toán

- Cho một mê cung kích thước n x m gồm các ô chứa các số 0, 1 Một ô

có thể đi sang ô kề nó nếu hai ô có chung trọng số Tìm đường từ vị trí (x1,y1)đến (x2,y2) gồm các ô liền kề không lặp lại

- Input là file input.txt với dòng đầu ghi n m k, k là số ô chứa số 1 Sau

đó là k dòng ghi tọa độ x y của các ô chứa số 1 Cuối cùng là 2 dòng ghi tọa độx1 y1 x2 y2 của điểm xuất phát và đích

2.2.2 Thuật toán

- Thuật toán có thể được xây dựng dựa trên tư tưởng của thuật toán duyệttheo chiều sâu hoặc theo chiều rộng

2.2.2.1 Thuật toán loang

- Thuật toán loang dựa trên ý tưởng của thuật toán tìm kiếm theo chiềurộng

- Ý tưởng của thuật toán: đầu tiên, đánh dấu ô (x1,y1) là có thể đến Mỗibước ta mở rộng vùng có thể đến được ra xung quanh một lượt ô bằng cáchđánh dấu có thể đến cho tất cả các ô có thể đi sang từ một ô có thể đến Việc

mở rộng được lặp đi lặp lại tới khi ô đích (x2,y2) được đánh dấu có thể đến

2.2.2.2 Thuật toán thử - quay lui

- Thuật toán thử - quay lui dựa trên ý tưởng của thuật toán tìm kiếm theochiều sâu

- Ý tưởng của thuật toán: đánh dấu ô (x1,y1) Đi theo một đường bất kì,nếu gặp một điểm giao nhau của nhiều đường, đánh dấu lại điểm giao nhau đó.Khi gặp đường cụt, quay lại điểm giao nhau gần nhất đã đánh dấu và đánh dấuđường vừa đi là đường cụt Một điểm giao nhau được đánh dấu là cụt nếu mọiđường đi từ nó đều là đường cụt Đi lần lượt tất cả các con đường tới khi gặpđược ô đích

Trang 16

2.3 Tìm đường đi ngắn nhất

2.3.1 Phát biểu bài toán

- Cho đồ thị có hướng có trọng số liên thông G = (V,E) với V = {1, 2, ,n} và tập E gồm m cạnh có trọng số c(e) Bài toán tìm đường đi ngắn nhất trên

đồ thị được phát biểu như sau: tìm đường đi ngắn nhất từ đỉnh xuất phát s đếnđỉnh t trên đồ thị G

- Ta có giả mã thuật toán Ford Bellman tìm đường đi ngắn nhất từ mộtđỉnh s đến tất cả các đỉnh còn lại của một đồ thị bất kì:

Giả mã 2.3 FORD_BELLMAN

2.3.2 Thuật toán Dijkstra

- Thuật toán Dijkstra tìm đường đi ngắn nhất từ một đỉnh s đến tất cả cácđỉnh còn lại của đồ thị trọng số không âm

Trang 17

- Ta có giả mã thuật toán Dijkstra:

nếu d[v] > d[u] + c[u,v] thì d[v] = d[u] + c[u,v]

- T là tập các đỉnh đã có nhãn chưa cố định: đường đi ngắn nhất hiện tại

end

Trang 18

- Thuật toán Dijkstra có độ phức tạp O(n2).

- Hình minh họa quá trình thực hiện thuật toán Dijkstra tìm đường đingắn nhất từ đỉnh 1 tới tất cả các đỉnh còn lại: các cặp đỉnh u và v không tồn tạicạnh nối sẽ có trọng số c[u,v] = 

Hình 2.5 Cập nhật nhãn trong quá trình thực hiện thuật toán Dijkstra

2.3.2 Thuật toán Floyd

- Thuật toán Floyd tìm đường đi giữa tất cả các cặp đỉnh của đồ thị

- Đầu ra của thuật toán:

+ d[i,j]: độ dài đường đi ngắn nhất từ i → j

+ p[i,j]: đỉnh kề trước đỉnh j trên đường đi ngắn nhất hiện tại từ đỉnh i đến đỉnh j

- Thuật toán Floyd có độ phức tạp O(n3)

1∞, 1 2, 3, 4, 5, 6, 7 26, 2 ∞, 1∞, 1 18, 210, 2*3, 4, 5, 6, 7 22, 724, 7 ∞, 1 13, 7*-3, 4, 5, 6 22, 7*24, 729, 6 3, 4, 5 -24, 7*29, 6 -29, 6*

Trang 19

- Ta có giả mã thuật toán Floyd:

Giả mã 2.6 PATH_FINDING_FLOYD

2.4 Đồ thị Hamilton

2.4.1 Khái niệm

+ Đường đi và chu trình Hamilton

Đường đi trong G đi qua mỗi đỉnh của nó một lần được gọi là đường đi Hamilton Đường đi Hamilton có đỉnh đầu và đỉnh cuối trùng nhau gọi là chu trình Hamilton.

+ Đồ thị Hamilton và nửa Hamilton

Đồ thị có chu trình Hamilton được gọi là đồ thị Hamilton Đồ thị có đường đi Hamilton được gọi là đồ thị nửa Hamilton.

end end

procedure PATH_FINDING_FLOYD

begin

for i:= 1 to n do

for j:= 1 to n do begin

d[i,j] := c[i,j];

p[i,j] := i;

end

Trang 20

Đồ thị có hướng liên thông mạnh G có các đỉnh có bán bậc ra và bán bậc vào không nhỏ hơn n/2 là đồ thị Hamilton.

Trang 21

Hình 2.7 Đồ thị Hamilton và nửa Hamilton

2.4.2 Thuật toán tìm chu trình Hamilton

- Cho đồ thị Euler G = (V,E) được biểu diễn bởi danh sách kề ke(u)

- Ta có giả mã thuật toán xây dựng tất cả các chu trình Hamilton trên đồthị G:

Giả mã 2.8 BUILD_HAMILTON_CYCLE

1 3

1 3

if chuaxet[y] then begin

Trang 22

sẽ cho ta một chu trình Hamilton trên đồ thị G đã cho.

+ Xây dựng mã Gray: ta có hình vẽ sau minh họa quá trình xây dựng mã Gray:

Hình 2.9 Xây dựng mã Gray

Trang 23

CHƯƠNG 3: CÂY 3.1 Khái niệm cây

+ Khái niệm 1

Cây là đơn đồ thị vô hướng liên thông không có chu trình.

+ Khái niệm 2

Ta có định nghĩa cây được trình bày đệ qui như sau:

+ Một nút là một cây Nút đó cũng là gốc của cây ấy.

+ Nếu T 1 , T 2 , , T k là các cây đôi một phân biệt, với n 1 , n 2 , , n k

lần lượt là các gốc, n là một nút và n có quan hệ cha – con với n 1 ,

n 2 , , n k thì lúc đó một cây mới sẽ được tạo lập, với n là gốc của cây đó.

- Khi đó n được gọi là cha của n1, n2, , nk; ngược lại n1, n2, , nk đượcgọi là con của n Các cây T1, T2, , Tk được gọi là cây con của cây T

- Dễ thấy sự đồng nhất của hai khái niệm: ta sẽ chứng minh cây được nêu

ra ở khái niệm 2 sẽ thỏa mãn hai tính chất của cây được đề cập ở khái niệm 1:

+ Cây là đơn đồ thị liên thông: chúng ta chứng minh theo tư tưởng quinạp: giả sử các cây T1, T2, , Tk đều là các đồ thị liên thông Xét hai đỉnh u, vbất kì thuộc hai cây Ti và Tj, khi đó do Ti và Tj là hai đồ thị liên thông nên tồntại đường đi từ u đến ni và từ nj đến v Trên cây T, n lại là nút cha của các nút

n1, n2, , nk; do đó tồn tại cạnh nối n với n1 và n với n2 Vậy: đường đi giữa haiđỉnh u và v bất kì trên cây T sẽ là u, , ni, n, nj, , v

- Khái niệm 1 và khái niệm 2 khác nhau ở điểm: khái niệm 2 quan tâmtới nút nào là gốc của cây; còn khái niệm 1 thì không Khi đã xác định được nútgốc của cây, chúng ta mới quan tâm tới quan hệ cha – con và các quan hệ suydiễn giữa các nút trong cây Khái niệm 1 nhìn nhận cây dưới góc độ một dạng

đồ thị đặc biệt, và do đó quan tâm tới các tính chất đặc biệt của đồ thị đó

3.2 Tính chất của cây

- Giả sử T = (V,E) là đơn đồ thị vô hướng n đỉnh Các mệnh đề sau đây

là tương đương:

Trang 24

i T là cây, tức là T liên thông và không có chu trình.

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 của nó đều là cầu

v Hai đỉnh bất kì của T được nối với nhau bởi đúng một đường đi đơn

vi T không chứa chu trình nhưng hễ cứ thêm vào nó một cạnh ta thuđược đúng một chu trình

- Chúng ta chứng minh các tính chất của cây theo thứ tự: i → ii → iii →

iv → v → vi → i:

(i → ii) Theo khái niệm 3.1.1 thì cây không chứa chu trình Ta sẽ chứng minh

theo ý tưởng qui nạp: cây có n đỉnh thì có n-1 cạnh Thực vậy: với hai đỉnh, tachỉ xây dựng được duy nhất một cây có một cạnh Giả sử: cây có n-1 đỉnh sẽ cón-2 cạnh Trên một cây có n đỉnh bất kì, ta xét đường đi dài nhất giữa hai đỉnhbất kì trên cây Khi đó đỉnh đầu và đỉnh cuối của đường đi sẽ là lá, vì nếukhông là lá thì đường đi đó có thể được kéo dài dẫn tới đường đi đang xétkhông thỏa mãn là đường đi dài nhất Loại bỏ một đỉnh lá và cạnh duy nhất nối

nó với đỉnh kề nó, chúng ta thu được cây có n-1 đỉnh và n-2 cạnh Do vậy cây

có n đỉnh ban đầu sẽ có n-2 + 1 = n-1 cạnh, chính là điều phải chứng minh

(ii → iii) Theo ii, T có n-1 cạnh Ta chứng minh T liên thông theo ý tưởng

phản chứng Giả sử T không liên thông, khi đó T phân rã thành k thành phầncon liên thông T1, T2, , Tk với số đỉnh và số cạnh của cây Ti là ni và ei Vì Tkhông chứa chu trình nên Ti cũng không chứa chu trình Ti liên thông và khôngchứa chu trình nên theo i thì Ti là cây, suy ra ei = ni - 1 với mọi 1 ≤ i ≤ k Khi

đó, số cạnh của cây T bằng tổng số cạnh của tất cả các thành phần con Ti:

eT = ∑ei = ∑(ni - 1) = ∑ni - k = n - k < n-1

trái với giả thiết ii cung cấp: T có n-1 cạnh Vậy ta có điều phải chứng minh

(iii → iv) Theo iii, T liên thông Ngoài ra, khi loại bỏ một cạnh bất kì trên cây,

chúng ta có một đồ thị có n đỉnh và n-2 cạnh Nếu loại bỏ đỉnh lá và cạnh kềvới nó khỏi cây, chúng ta sẽ thu được đồ thị con có tính liên thông giống đồ thị

Trang 25

ban đầu và số cạnh cũng như số đỉnh giảm đi một Lặp lại thao tác này, ta thuđược đồ thị gồm hai đỉnh và không có cạnh nào, là đồ thị không liên thông, do

đó đồ thị gồm n đỉnh và n-2 cạnh là không liên thông Vậy mọi cạnh trong câyđều là cầu, ta có điều phải chứng minh

(iv → v) Theo iv, T liên thông nên giữa mọi cặp đỉnh của nó đều có đường đi.

Ta chứng minh sự tồn tại duy nhất của đường đi nối hai đỉnh bất kì theo ýtưởng qui nạp: nếu giữa một cặp đỉnh có hai đường đi, ta xét đồ thị con của Tchỉ gồm các đỉnh và các cạnh thuộc hai đường đi trên Trên đồ thị con này sẽtồn tại đỉnh có hai đỉnh kề thuộc hai đường đi khác nhau, và do đó trong cáccạnh kề với đỉnh này sẽ có cạnh không phải là cầu, trái với giả thiết iv cungcấp Do đó ta có điều phải chứng minh

(v → vi) Vẫn theo ý tưởng phản chứng: nếu T chứa chu trình thì sẽ có hai

đường đi nối hai đỉnh bất kì thuộc chu trình đó, vi phạm giả thuyết do v cungcấp Do đó T không chứa chu trình Ngoài ra, nếu thêm vào cạnh nối hai đỉnh u

và v trên T, cạnh này sẽ hợp với đường đi nối u với v trên T thành một chutrình Do đường đi đơn giữa u và v là duy nhất nên chỉ thu được một chu trình.Vậy ta có điều phải chứng minh

(vi → i) vi đã cung cấp: T không chứa chu trình Ngoài ra, theo ý tưởng phản

chứng, giả sử T không liên thông Khi đó T phân rã thành ít nhất hai thành phầnliên thông Nếu thêm một cạnh nối hai đỉnh bất kì thuộc hai thành phần liênthông khác nhau, chúng ta không thu được chu trình nào do giữa hai đỉnh nàykhông tồn tại đường đi Do đó, T là liên thông, ta có điều phải chứng minh

3.3 Các khái niệm liên quan

Trang 26

+ Cấp của cây là cấp cao nhất của nút trên cây.

Cho G = (V, E) là đơn đồ thị vô hướng liên thông Cây T = (V, F) với F

E được gọi là cây phủ (cây khung) của đồ thị.

Định lý

Số cây phủ của đồ thị K n là n n-2

3.4.2 Xây dựng cây phủ của đơn đồ thị vô hướng

- Dễ thấy, nếu chúng ta duyệt đồ thị và đảm bảo rằng không có đỉnh nàođược thăm hai lần đồng thời mỗi lần thăm đỉnh mới ta kết nạp cạnh nối đỉnhmới và đỉnh thăm kề trước thì sẽ thu được một cây phủ của đồ thị

- Bài toán: cho đơn đồ thị vô hướng G = (V, E) Thực hiện duyệt theochiều rộng và chiều sâu G để thu được cây phủ T = (V, F) của G

3.4.2.1 Duyệt theo chiều sâu

- Thủ tục BUILD_SPANNING_TREE_DFS thực hiện việc thăm mộtđỉnh trên đồ thị đã cho theo hướng duyệt theo chiều sâu:

Trang 27

Giả mã 3.1 BUILD_SPANNING_TREE_DFS

- Chương trình chính thực hiện việc duyệt đồ thị G đã cho để thu đượccây phủ T: root là một đỉnh bất kì thuộc V

Giả mã 3.2 BUILD_SPANNING_TREE_DFS_MAIN_PROGRAM

3.4.2.2 Duyệt theo chiều rộng

- Thủ tục BUILD_SPANNING_TREE_BFS thực hiện việc thăm mộtđỉnh trên đồ thị đã cho theo hướng duyệt theo chiều rộng:

Trang 28

BUILD_SPANNING_TREE_BFS trình bày ở trên có độ phức tạp tính toánO(n+m), với n là số đỉnh và m là số cạnh của đồ thị đã cho.

- Cây phủ thu được từ thuật toán BUILD_SPANNING_TREE_BFS làcây đường đi ngắn nhất từ đỉnh root đến tất cả các đỉnh còn lại của đồ thị

procedure BUILD_TREE_BFS(r) begin

QUEUE := Ø;

QUEUE ← r;

visited[r] := true;

while QUEUE != Ø do begin

Trang 29

3.5 Cây phủ nhỏ nhất

3.5.1 Phát biểu bài toán

- Cho đơn đồ thị vô hướng G = (V, E) với tập đỉnh V = {1, 2, , n} vàtập cạnh E gồm m cạnh Mỗi cạnh e của G được gán một số thực c(e), được gọi

là độ dài của cạnh đó Giả sử H = (V, T) là cây phủ của đồ thị G Ta gọi độ dàic(H) của cây phủ H là tổng độ dài các cạnh của nó:

c(H) =

Bài toán đặt ra là trong tất cả các cây phủ của đồ thị G cho trước, hãy tìmcây phủ với độ dài nhỏ nhất Cây phủ như vậy được gọi là cây phủ nhỏ nhất của

đồ thị

- Nếu chúng ta sử dụng phương pháp vét cạn: liệt kê tất cả các cây phủ

có thể của đồ thị và tìm ra cây phủ nhỏ nhất, chi phí tìm kiếm sẽ ở mức khôngchấp nhận được Đồ thị Kn có nn-2 cây phủ, do đó độ phức tạp tính toán sẽ cỡO(nn-2), rõ ràng không thể thực hiện được với cả những đồ thị chỉ có vài chụcđỉnh

ta biểu diễn các thành phố bằng các đỉnh, các con đường có thể xây dựng bằngcác cạnh ta sẽ thu được một đồ thị có trọng số và bài toán trở thành tìm cây phủnhỏ nhất trên đồ thị này

+ Bài toán nối mạng máy tính: cần nối mạng một hệ thống gồm n máy vitính đánh số từ 1 → n Biết chi phí nối máy i với máy j là c[i,j] (thông thườngchi phí này tuyến tính với độ dài cáp nối cần sử dụng) Hãy tìm cách nối mạngsao cho tổng chi phí nối mạng là nhỏ nhất

Trang 30

- Một số bài toán có thể qui về bài toán cây phủ nhỏ nhất thông qua cácphép biến đổi trọng số của đồ thị:

+ Bài toán cây phủ lớn nhất: rõ ràng, nếu đảo dấu trọng số các cạnh trêncây, ta sẽ chuyển từ bài toán cây phủ lớn nhất thành bài toán cây phủ nhỏ nhất

+ Bài toán độ tin cậy của mạng nối tiếp: trong một mạng điện hay mạngmáy tính nối tiếp, độ tin cậy của một mạch được tính bằng tích độ tin cậy cácđoạn mạch thành phần trên mạng đó:

p =  piBài toán đặt ra là xây dựng mạng sao cho độ tin cậy là lớn nhất Do đó,nếu chúng ta sử dụng công thức biến đổi:

- ln(p) = - ln(pi) = ∑ (- ln (pi))thì bài toán xây dựng mạng có độ tìn cậy lớn nhất sẽ trở thành bài toán cây phủnhỏ nhất

3.5.2 Thuật toán Kruskal

3.5.2.1 Ý tưởng thuật toán

- Tập cạnh của cây phủ nhỏ nhất sẽ được xây dựng lần lượt theo nguyêntắc sau: cạnh được kết nạp vào cây phủ nhỏ nhất là cạnh chưa được kết nạp cótrọng số nhỏ nhất và việc kết nạp nó vào tập cạnh T sẽ không tạo ra chu trìnhtrên cây H Công việc xây dựng tập cạnh T kết thúc khi H liên thông, tươngđương |T| = n-1

3.5.2.2 Cài đặt thuật toán

Trang 31

- Ta có giả mã chương trình

Giả mã 3.5 BUILD_MINIMUM_SPANNING_TREE_KRUSKAL

- Dễ thấy: thuật toán duyệt lần lượt các cạnh của đồ thị ban đầu theo thứ

tự trọng số tăng dần, do đó trước hết ta sắp xếp các cạnh của đồ thị theo thứ tựtrọng số tăng dần Thao tác sắp xếp có thể thực hiện bằng các thuật toán sắpxếp cổ điển: sắp xếp nhanh, sắp xếp vun đống, vv Chi phí cho thao tác sắpxếp m cạnh theo các thuật toán này sẽ là O(m logm)

- Việc lựa chọn một cạnh e trên đồ thị G để bổ sung vào tập cạnh T đangxây dựng của cây H đòi hỏi một thủ tục hiệu quả để kiểm tra xem tập cạnh T U{e} có tạo ra chu trình hay không Một cách cài đặt đơn giản được giới thiệu ởđây sẽ sử dụng cấu trúc dữ liệu rừng để đánh dấu các cạnh đã được kết nạp vàotập cạnh T của cây H: trong mỗi bước trung gian, tập đỉnh V và tập các cạnh đãđược kết nạp vào tập T sẽ tạo ra một rừng Một cạnh được kết nạp vào T khi vàchỉ khi có hai đầu mút thuộc hai cây khác nhau trên rừng đó và cạnh này sẽ kếtnối hai cây phân biệt chứa hai đầu mút của cạnh thành một cây mới Cài đặt cụthể cho cấu trúc rừng này có thể sử dụng danh sách liên kết hoặc một vectormột chiều để đánh dấu đỉnh nào thuộc cây nào

3.5.2.3 Chứng minh thuật toán và đánh giá độ phức tạp

- Chứng minh tính đúng đắn của thuật toán: Nếu đồ thị G liên thông, Hthu được là đồ thị có n đỉnh và n-1 cạnh, do đó H là cây, đồng nghĩa H là cây

procedure BUILD_MINIMUM_SPANNING_TREE_KRUSKAL begin

end

Trang 32

phủ của G Ta chứng minh H thu được từ thuật toán trên là cây có độ dài nhỏnhất theo tư tưởng phản chứng Giả sử tồn tại cây phủ K = (V,S) của đồ thị G

có độ dài nhỏ hơn H: c(K) < c(H) Gọi ek là cạnh đầu tiên trong dãy cạnh của Hkhông thuộc K Khi đó đồ thị con của G thu được bằng cách bổ sung cạnh ekvào K sẽ chứa duy nhất một chu trình C Rõ ràng, C sẽ chứa hai cạnh et và ekvới: et  H, et K, ek  K và ek  H Do chu trình C là duy nhất nên đồ thị K’thu được từ cây K bằng cách thay cạnh et bởi cạnh ek cũng sẽ là một cây phủcủa đồ thị G Ngoài ra, theo thuật toán Kruskal, c(ek) ≤ c(et) nên c(K’) ≤ c(K) và

số cạnh chung của K’ với H sẽ hơn số cạnh chung của K với H một cạnh Lặplại thao tác trên một số bước hữu hạn, chúng ta sẽ thu được cây phủ Ki’ ≡ H màc(Ki’) ≤ c(K), tức là c(H) ≤ c(K) Mâu thuẫn này ngược với giả sử ban đầu cho

ta điều phải chứng minh

- Đánh giá độ phức tạp: rõ ràng, trong trường hợp xấu nhất chúng ta cũngchỉ phải xét m cạnh trong quá trình kết nạp cạnh cho cây H Do đó, chi phí tínhtoán sẽ phụ thuộc vào thao tác sắp xếp các cạnh của G theo thứ tự trọng số tăngdần Nếu sử dụng thuật toán sắp xếp vun đống, chi phí tạo đống ban đầu sẽ làO(m) Mỗi phần tử tiếp theo có thể được tìm ra với chi phí O(logm), do đó nếucây T được hoàn thiện sau khi xét tới cạnh thứ p của đồ thị G thì chi phí củathuật toán Kruskal sẽ là O(m + p logm)

- Thuật toán Kruskal làm việc kém hiệu quả đối với những đồ thị dày: đồthị có số cạnh m ≈ n(n-1)/2

3.5.3 Thuật toán Prim

3.5.3.1 Ý tưởng thuật toán

- Thuật toán Prim còn được gọi là thuật toán lân cận gần nhất Bắt đầu từmột đỉnh bất kì, cây phủ nhỏ nhất sẽ được xây dựng lần lượt theo nguyên tắcsau: cạnh được kết nạp vào cây phủ nhỏ nhất là cạnh chưa được kết nạp cótrọng số nhỏ nhất và nối một đỉnh thuộc tập đỉnh đã kết nạp vào cây phủ vớimột đỉnh thuộc tập đỉnh chưa được kết nạp vào cây phủ Sau khi kết nạp cạnh

đó, đỉnh thuộc tập đỉnh chưa được kết nạp vào cây phủ sẽ được kết nạp vào cây.Quá trình tiếp tục cho đến khi thu được cây gồm n đỉnh và n-1 cạnh sẽ chính làcây phủ nhỏ nhất cần tìm

Trang 33

3.5.3.2 Cài đặt thuật toán

- G được cho bởi ma trận trọng số C = {c[i,j], i,j = 1, ,n} Trong quátrình thực hiện thuật toán, các đỉnh của đồ thị sẽ được gán hai nhãn:

+ d[v] dùng để ghi nhận độ dài của cạnh có độ dài nhỏ nhất trong

số các cạnh nối đỉnh v với các đỉnh đã được kết nạp vào cây khung

d[v] := min{c[v,w]: w  VH} (= c[v,z])+ near[v] dùng để ghi nhận đỉnh đã được kết nạp vào cây khung

while not stop do begin

if d[v] > c[u,v] then begin

d[v] := c[u,v]; near[v] := u;

end end

end end

Trang 34

3.6 Cây nhị phân tìm kiếm

Để khắc phục nhược điểm của phương pháp tìm kiếm nhị phân đối vớimột dãy khóa biến động liên tục, chúng ta tìm hiểu một phương pháp mới dựatrên cơ sở dãy khóa được tổ chức dưới dạng cây nhị phân Cây nhị phân dùngtrong phương pháp này được gọi là cây nhị phân tìm kiếm, mỗi nút của câytương ứng với một khóa Các thao tác cập nhật dãy khóa cũng tương ứng vớichỉnh sửa trên cây nhị phân tìm kiếm

3.6.1 Khái niệm

- Cây nhị phân tìm kiếm ứng với n khóa k1, k2, , kn là một cây nhị phân

mà mỗi nút của nó đều được gán một giá trị khóa nào đó trong các giá trị khóa

đã cho và đối với mọi nút trên cây tính chất sau đây luôn được thỏa mãn:

+ Mọi khóa thuộc cây con trái nút đó đều nhỏ hơn khóa ứng với nút đó.+ Mọi khóa thuộc cây con phải nút đó đều lớn hơn khóa ứng với nút đó

3.6.2 Giải thuật tìm kiếm

- Giải thuật tìm kiếm trên cây nhị phân tìm kiếm có gốc được trỏ bởi Tnút có khóa bằng X Nếu tìm kiếm được thỏa mãn thì trả lại giá trị 1 và đưa racon trỏ q trỏ tới nút đó, nếu không trả lại giá trị 0

- Giải thuật được thực hiện bằng cách thực hiện lặp lại công việc sau chotới khi cây được xét là cây rỗng: thực hiện phép so sánh giá trị cần tìm với khóa

ở gốc Khi đó xảy ra các trường hợp:

+ Không có gốc (cây rỗng): X không có trên cây, phép tìm kiếm khôngthỏa mãn

+ X trùng với khóa gốc: phép tìm kiếm được thỏa mãn

+ X nhỏ hơn khóa gốc: tìm kiếm giá trị cần tìm trên cây con bên trái.+ X lớn hơn khóa gốc: tìm kiếm giá trị cần tìm trên cây con bên phải

- Cây nhị phân tìm kiếm được cài đặt sử dụng cấu trúc dữ liệu danh sáchliên kết, các nút là bản ghi có dạng

LPTR KEY RPTR

Trang 35

Giả mã 3.7 BINARY_SEARCH_TREE

3.6.3 Phân tích và đánh giá độ phức tạp

- Rõ ràng hình dáng cây nhị phân tìm kiếm phụ thuộc vào dãy khóa đưavào Trong quá trình cập nhật cây, chúng ta không thể dự đoán trước xu thếphát triển của cây

+ Nếu cây nhị phân tìm kiếm là cân đối (chiều cao của hai cây concủa mọi nút trên cây chênh nhau không quá 1 đơn vị), chi phí tìm kiếm sẽ là

Cmin = [log2n] + 1

+ Nếu cây nhị phân là lệch trái hoặc lệch phải (khi dãy khóa đưavào đã được sắp xếp trước) thì thao tác tìm kiếm của chúng ta trở thành mộtphép duyệt tuần tự trên danh sách tuyến tính cho trước, điều này khiến chi phitìm kiếm là Cmax = n

+ Người ta đã chứng minh được: chi phí trung bình của giải thuậttìm kiếm sử dụng cây nhị phần là Ctb = 1.386 x log2n Do đó độ phức tạp củagiải thuật vẫn là O(logn)

- Nếu cố gắng thực hiện việc cân đối lại cây sau mỗi bước bổ sung khóavào dãy, chi phí cân đối cây sẽ làm tăng chi phí của cài đặt giải thuật tìm kiếmnhị phân Như trong hình vẽ minh họa dưới đây, trong trường hợp cây nhị phântìm kiếm được cân đối lại thì hầu hết các mối nối đều không được giữ nguyên.Điều này chứng tỏ chi phí cân đối cây nhị phân là rất lớn

3.6.4 Thêm nút mới

- Thao tác bổ sung nút mới chỉ thực hiện khi việc tìm kiếm kết thúc ở nút

p của cây nhị phân tìm kiếm T và k[p] ≠ X

Trang 36

- Ta có giả thuật toán cho thao tác thêm một nút mới trên cây nhị phântìm kiếm Chú ý rằng đoạn giả mã tìm kiếm trên cây nhị phân ban đầu đượcthêm vào vì thao tác thêm nút chỉ được thực hiện khi khóa X không được tìmthấy trên cây.

- Cây nhị phân tìm kiếm được xây dựng tương ứng với một dãy khóa bất

kì, chúng ta không cần thao tác sắp xếp trước như đối với giải thuật tìm kiếmnhị phân Do đó, sau khi xây dựng được cây nhị phân tìm kiếm tương ứng với

Function INSERT_NODE(T,X)

q := T //Tìm vị trí cần bổ sung

Ngày đăng: 23/01/2015, 21:14

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
1. Nguyễn Cam - Chu Đức Khánh (1999), Lý thuyết đồ thị, NXB Tp Hồ Chí Minh Sách, tạp chí
Tiêu đề: Lý thuyết đồ thị
Tác giả: Nguyễn Cam - Chu Đức Khánh
Nhà XB: NXB Tp Hồ Chí Minh
Năm: 1999
2. Đỗ Đức Giáo (1999), Toán rời rạc, NXB Đại Học Quốc gia Hà nội Sách, tạp chí
Tiêu đề: Toán rời rạc
Tác giả: Đỗ Đức Giáo
Nhà XB: NXB Đại Học Quốc gia Hà nội
Năm: 1999
3. Đỗ Đức Giáo (1998), Cơ sở toán trong lập trình, NXB Khoa học và Kỹ thuật, Hà Nội Sách, tạp chí
Tiêu đề: Cơ sở toán trong lập trình
Tác giả: Đỗ Đức Giáo
Nhà XB: NXB Khoa học và Kỹ thuật
Năm: 1998
4. Nguyễn Đức Nghĩa - Nguyễn Tô Thành (1999), Toán rời rạc, NXB Giáo Dục Sách, tạp chí
Tiêu đề: Toán rời rạc
Tác giả: Nguyễn Đức Nghĩa - Nguyễn Tô Thành
Nhà XB: NXB Giáo Dục
Năm: 1999
5. Đỗ Xuân Lôi (1999), Cấu trúc dữ liệu và giải thuật, NXB thống kê Sách, tạp chí
Tiêu đề: Cấu trúc dữ liệu và giải thuật
Tác giả: Đỗ Xuân Lôi
Nhà XB: NXB thống kê
Năm: 1999

HÌNH ẢNH LIÊN QUAN

Hình 1.1. Mô hình hóa bản đồ địa lý bằng đồ thị - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 1.1. Mô hình hóa bản đồ địa lý bằng đồ thị (Trang 4)
Hình 1.2. Các đồ thị K n , C n  và W n  và K 4,3 - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 1.2. Các đồ thị K n , C n và W n và K 4,3 (Trang 6)
Đồ thị có chu trình Euler được gọi là đồ thị Euler. Đồ thị có đường đi  Euler được gọi là đồ thị nửa Euler. - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
th ị có chu trình Euler được gọi là đồ thị Euler. Đồ thị có đường đi Euler được gọi là đồ thị nửa Euler (Trang 13)
Hình 2.1. Đồ thị Euler và nửa Euler - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 2.1. Đồ thị Euler và nửa Euler (Trang 14)
Hình 2.5. Cập nhật nhãn trong quá trình thực hiện thuật toán Dijkstra - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 2.5. Cập nhật nhãn trong quá trình thực hiện thuật toán Dijkstra (Trang 18)
2.4. Đồ thị Hamilton - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
2.4. Đồ thị Hamilton (Trang 19)
Hình 2.7. Đồ thị Hamilton và nửa Hamilton - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 2.7. Đồ thị Hamilton và nửa Hamilton (Trang 21)
Hình 2.9. Xây dựng mã Gray - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 2.9. Xây dựng mã Gray (Trang 22)
Hình 3.10. Cây quyết định đi chơi golf - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 3.10. Cây quyết định đi chơi golf (Trang 39)
Hình 4.1. Mạng - luồng - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 4.1. Mạng - luồng (Trang 40)
Hình 4.2. Đồ thị tăng luồng - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 4.2. Đồ thị tăng luồng (Trang 43)
Hình 5.1. Bài toán tô màu đồ thị - Xây dựng chương trình hỗ trợ giảng dạy Lý thuyết đồ thị
Hình 5.1. Bài toán tô màu đồ thị (Trang 45)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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