Đồ thị có trọng số trên các cạnh có thể sử dụng để giải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong mạng giao thông.. Bậc của đỉnh v trong đồ thị, ký hiệu là degv,
Trang 1CHƯƠNG 1 ĐẠI CƯƠNG VỀ ĐỒ THỊ 4
1.1 Giới thiệu 4
1.2 Định nghĩa đồ thị 4
1.3 Một số thuật ngữ cơ bản 5
1.4 Đường đi, chu trình và đồ thị liên thông 5
1.5 Biểu diễn đồ thị trên máy tính 7
CHƯƠNG 2 CHU TRÌNH EULER VÀ BÀI TOÁN NGƯỜI ĐƯA THƯ 8
2.1 Định nghĩa 8
2.2 Điều kiện cần và đủ 8
2.2.1 Định lý 1 (Định lý Euler) 8
2.3 Các thuật toán tìm chu trình Euler 10
2.4 Thiết kế cấu trúc dữ liệu và giải thuật tìm đường đi, chu trình Euler 12
2.5 Bài toán người đưa thư 14
2.5.1 Phát biểu bài toán 14
2.5.2 Giải thuật 14
2.5.3 Giải thuật mịn 15
CHƯƠNG III CÀI ĐẶT BÀI TOÁN NGƯỜI ĐƯA THƯ 18
3.1 Tìm đường đi, chu trình Euler 18
3.2 Giải bài toán người đưa thư 21
KẾT LUẬN 29
TÀI LIỆU THAM KHẢO 30
Trang 2GIỚI THIỆ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 Những ý tưởng cơ bản của nó được đưa ra từ thế
kỷ XVIII bởi nhà toán học Thụy sĩ tên là Leonhard Euler.
Lý thuyết đồ thị được dùng để giải các bài toán trong nhiều lĩnh vực khác nhau Chúng ta có thể xác định hai máy tính trong mạng có thể trao đổi thông tin được với nhau hay không nhờ mô hình đồ thị của mạng máy tính Đồ thị có trọng số trên các cạnh có thể sử dụng để giải các bài toán như: Tìm đường đi ngắn nhất giữa hai thành phố trong mạng giao thông Chúng ta cũng còn sử dụng đồ thị để giải các bài toán về lập lịch, thời khóa biểu, và phân bố tần số cho các trạm phát thanh và truyền hình…
Ngày nay Lý thuyết đồ thị đã phát triển thành một ngành Toán học ứng dụng có vị trí đặc biệt quan trọng về mặt lý thuyết cũng như ứng dụng Trong nội dung cuốn tiểu luận này nhóm chúng tôi xin trình bày về
“Chu trình Euler và bài toán người đưa thư”.
Đồng Hới, tháng 05 năm 2012
Trang 3- Đề tài: Chu trình Euler và bài toán người đưa thư
- Nhóm: 6 người
STT Họ tên Công việc(theo mục
Nhận xét củagiáo viên
1 Nguyễn Trần Sỹ Chương 1
3 Nguyễn Thị Hà Phương 2.5
5 Hoàng Đình Tuyền Chương 3
6 Nguyễn Duy Linh Chương 3
Trang 4CHƯƠNG 1 ĐẠI CƯƠNG VỀ ĐỒ THỊ
1.1 Giới thiệu
Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu và có nhiều ứngdụng trong ngành công nghệ thông tin Những tư tưởng cơ bản của lý thuyết đồthị được đề xuất vào những năm đầu của thế kỷ 18 bởi nhà toán học lỗi lạc ngườiThụy Sỹ: Leonhard Euler Chính ông là người đã sử dụng đồ thị để giải bài toánnổi tiếng về 7 cái cầu ở thành phố Konigberg
Những ứng dụng cơ bản của đồ thị như:
- Xác định tính liên thông trong một mạng máy tính: hai máy tính nào đó có thểtruyền dữ liệu cho nhau được không
- Tìm đường đi ngắn nhất trên mạng giao thông
và hiển nhiên là không có cặp [u,u] nào đó trong E
- E là một họ các cặp không có thứ tự của V gọi là các cạnh.
Định nghĩa 1.2.3 Đơn đồ thị có hướng là một bộ G=<V,E>, trong đó:
c Không phải đơn đồ thị vô hướng do có cạnh nối một đỉnh với chính nó
Trang 5
Định nghĩa 1.2.4 Đa đồ thị có hướng là một bộ G=<V,E>, trong đó
- V ≠ Ø là tập hợp hữu hạn gồm các đỉnh của đồ thị
- E là một họ các cặp có thứ tự của V gọi là các cung
Các cung nối cùng một cặp đỉnh được gọi là các cung song song
Ví dụ:
Chú ý:
- Đồ thị sau vẫn được coi là đơn đồ thị có hướng vì e1và e2, e3 và e4 không phải
là 2 cung song song (do khác hướng)
1.3 Một số thuật ngữ cơ bản
Định nghĩa 1.3.1 Cho đồ thị vô hướng G=<V,E>.
- Hai đỉnh u và v của đồ thị được gọi là kề nhau nếu (u,v) là một cạnh của đồ
thị
- Nếu e=(u,v) là cạnh của đồ thị thì ta nói cạnh này là liên thuộc với hai đỉnh u
và v Cạnh được nói là nối đỉnh u và v Đỉnh u và v được gọi là đỉnh đầu của
cạnh e
Định nghĩa 1.3.2 Cho đồ thị vô hướng G=<V,E> Bậc của đỉnh v trong đồ thị,
ký hiệu là deg(v), là số cạnh liên thuộc với nó Đỉnh có bậc 0 được gọi là đỉnh côlập, đỉnh có bậc 1 gọi là đỉnh treo
Định nghĩa 1.3.3 Cho đồ thị có hướng G=<V,E>.
- Hai đỉnh u và v của đồ thị được gọi là kề nhau nếu (u,v) là một cung của đồ thị.
- Nếu e=(u,v) là cung của đồ thị thì ta nói cung này đi ra khỏi đỉnh u vào đi vào đỉnh v Đỉnh u được gọi là đỉnh đầu của cung e và đỉnh v được gọi là đỉnh cuối
của cung e
1.4 Đường đi, chu trình và đồ thị liên thông
Định nghĩa 1.4.1 Cho đồ thị *G = <V,E> (* ký hiệu cho dùng chung cả đồ thị
vô hướng và có hướng) Đường đi độ dài n từ đỉnh u đến đỉnh v (n là số nguyêndương) là dãy:
Trang 6Đỉnh u gọi là đỉnh đầu của đường đi, đỉnh v gọi là đỉnh cuối của đường đi.
Đường đi có đỉnh đầu và đỉnh cuối trùng nhau (u=v) gọi là chu trình
Ví dụ: Cho đồ thị vô hướng sau:
Một số đường đi từ đỉnh 2 đến đỉnh 7:
- Đường đi d1: 2 3 4 7 (đường đi độ dài 3)
- Đường đi d2: 2 3 4 1 3 6 7 (đường đi độ dài 6)
Một số chu trình trên đồ thị trên:
- Chu trình C1: 1 2 3 1 (chu trình có độ dài 3)
- Chu trình C2: 1 2 3 7 6 3 4 1 (chu trình có độ dài 7)
Định nghĩa 1.4.2 Đồ thị vô hướng G = <V,E> được gọi là liên thông nếu luôn
tìm được đường đi giữa hai đỉnh bất kỳ của nó
Ví dụ: Xét các đồ thị vô hướng sau:
Trong 2 đồ thị trên thì G1là đồ thị liên thông, còn G2 không phải là đồ thị liênthông vì giữa hai đỉnh 1 và 2 không tồn tại một đường đi nào
Định nghĩa 1.4.3 Cho đồ thị G = (V,E) Đồ thị H = <W,F> được gọi là đồ thị
con của G nếu và chỉ nếu W € V và F € E
Trong trường hợp một đồ thị vô hướng G không liên thông, nó sẽ được phânthành các đồ thị con độc lập nhau và chúng đều liên thông Mỗi đồ thị con nhưvậy được gọi là một thành phần liên thông của G
Định nghĩa 1.4.4 Cho đồ thị vô hướng G = <V,E> Đỉnh v của đồ thị được gọi là
đỉnh rẽ nhánh nếu việc loại bỏ v và các cạnh liên thuộc với nó ra khỏi đồ thị sẽlàm tăng số thành phần liên thông của đồ thị Cạnh e của đồ thị được gọi là cầunếu việc loại bỏ nó ra khỏi đồ thị sẽ làm tăng số thành phần liên thông của đồ thị
Ví dụ: Xét đồ thị sau:
Trang 7
Trong đồ thị trên, đỉnh 2 là đỉnh rẽ nhánh vì việc loại đỉnh này cùng với các cạnh(2,3), (2,1), (2,6) sẽ làm đồ thị có 2 thành phần liên thông Cạnh (2,3) là cầu Cáccạnh còn lại đều không phải là cầu Đối với đồ thị có hướng khái niệm liên thôngkhó thỏa mãn hơn do các cung bị hạn chế về chiều Từ đó, bên cạnh khái niệmliên thông như đề cập trong đồ thị vô hướng, ta sẽ đưa thêm khái niệm liên thôngnhẹ hơn: liên thông yếu
Định nghĩa 1.4.5 Cho G = <V,E> là đồ thị có hướng.
a G được gọi là liên thông mạnh nếu luôn tìm được đường đi giữa hai đỉnh bất
kỳ của nó
b G được gọi là liên thông yếu nếu đồ thị vô hướng tương ứng với nó (đồ thị vô
hướng có được bằng cách biến các cung một chiều thành các cạnh hai chiều) là
đồ thị vô hướng liên thông
1.5 Biểu diễn đồ thị trên máy tính
Định nghĩa 1.5.1.1 Cho đồ thị G = <V,E>, với tập đỉnh V = {v1, v2, , vn} Ta
gọi ma trận kề của đồ thị là ma trận A, kích thước nxn được xác định như sau:
Trang 8CHƯƠNG 2
CHU TRÌNH EULER VÀ BÀI TOÁN NGƯỜI ĐƯA THƯ
2.1 Định nghĩa
Cho đồ thị G=(V,E), V là tập hợp các đỉnh, E là tập hợp các cạnh
Chu trình Euler là chu trình qua mọi cạnh và mọi đỉnh đồ thị, mỗi cạnh
không đi quá 1 lần
Đường đi Euler là đường đi qua mọi cạnh và mọi đỉnh đồ thị, mỗi cạnh
không đi quá 1 lần
Cho đồ thị có hướng G=(V,E)
Chu trình có hướng Euler là chu trình có hướng qua mọi cung và mọi đỉnh
đồ thị, mỗi cung không đi quá 1 lần
Đường đi có hướng Euler là đường đi có hướng qua mọi cung và mọi đỉnh
đồ thị, mỗi cung không đi quá 1 lần
Đồ thị chứa chu trình Euler gọi là Đồ thị Euler.
(ii) (): Giả sử G liên thông và mọi đỉnh có bậc chẵn khác 0 Ta chứngminh G có chu trình Euler quy nạp theo số cạnh m của G
m = 1: Vì G liên thông và mọi đỉnh bậc chẵn nên G chỉ có 1 đỉnh và 1khuyên Khuyên đó cũng tạo thành chu trình Euler
Giả sử G có m cạnh, số đỉnh n > 0 và mọi đồ thị liên thông có số cạnh nhỏhơn m với mọi đỉnh bậc chẵn đều có chu trình euler
+ Trường hợp n = 1 hoặc 2 thì hiển nhiên tồn tại chu trình Euler
+ Trường hợp n > 2 Vì bậc của các đỉnh chẵn 2, bao giờ cũng chọn được
3 đỉnh a, b, c với các cạnh x = (a,b), y = (a,c)
- Giả sử G chứa cạnh z = (b,c)
Xét đồ thị G’ thu được từ G bằng cách loại bỏ ba cạnh x,y,z Sẽ xảy ra 1trong ba khả năng sau:
Trang 9 G’ liên thông Vì số cạnh của G’ nhỏ hơn m và các đỉnh vẫn có bậc chẵn
nên theo giả thiết quy nạp tồn tại chu trình Euler C’ của G’ Nối chu trình con(x,y,z) với C’ ta thu được chu trình Euler C của G
G’ có 2 thành phần liên thông G 1 và G 2 Không mất tính tổng quát giả
sử G1 chứa a, G2 chứa b và c G1 có chu trình Euler C1, G2 có chu trình Euler
C2 Ta xây dựng chu trình Euler C của G như sau Xuất phát từ đỉnh a đi theo chutrình C1 quay về a, sau đó đi theo cạnh x = (a,b) đến đỉnh b, từ b đi theo chu trình
C2 quay về b, sau đó đi theo cạnh z = (b,c) và y = (c,a) quay về a
2.2.2 Định lý 2
Cho đồ thị G có k đỉnh bậc lẻ Khi đó số đường đi tối thiểu phủ G là k/2 Chứng minh.
Ta đã biết số đỉnh bậc lẻ là chẵn, k=2n Chứng minh quy nạp theo n.
(i) n=1: Nối 2 đỉnh bậc lẻ với nhau bằng cạnh z ta thu được đồ thị G’thoả định lý Euler Như vậy G’ có chu trình Euler C’ Bỏ cạnh z trên C’ ta thuđược đường đi Euler phủ G
(ii) Giả sử G có số đỉnh bậc lẻ là 2n và định lý đúng với k<2n Nối 2đỉnh bậc lẻ a,b nào đó với nhau bằng cạnh z ta thu được đồ thị G’ có 2n-2 đỉnhbậc lẻ Theo giả thiết quy nạp G’ có n-1 đường đi phủ G’ Gọi P là đường đi quacạnh z Hiển nhiên a, b không phải đỉnh đầu hoặc cuối của P, vì vậy nếu bỏ cạnh
z ta thu được 2 đường đi P1 và P2 cùng với n-2 đường đi còn lại phủ đồ thị G
I
O v d v
2.2.3 Định lý 3
Trang 10(i) Đồ thị có hướng G có chu trình có hướng Euler khi và chỉ khi G liênthông yếu và mọi đỉnh có nửa bậc vào bằng nửa bậc ra, tức S = và T =
(ii) Nếu S , thì số đường đi có hướng tối thiểu phủ G là k Các đường
đi này nối các đỉnh của T đến các đỉnh của tập S
Ví dụ: Đồ thị
Đồ thị trên có chu trình Euler: (A,B,C,D,A)
2.3 Các thuật toán tìm chu trình Euler
2.3.1 Thuật toán 1
+ Đầu vào Đồ thị G , không có đỉnh cô lập.
+ Đầu ra Chu trình Euler C của G, hoặc kết luận G không có chu trình Euler + Phương pháp.
(1) Xuất phát: Đặt H := G, k := 1, C := Chọn đỉnh v G bất kỳ
(2) Xuất phát từ v, xây dựng chu trình bất kỳ Ck trong H
Nếu tồn tại Ck , nối Ck vào C, C := C Ck Sang bước (3)
Nếu không tồn tại Ck , thì kết luận không có chu trình Euler, kết thúc.
(3) Loại khỏi H chu trình Ck Nếu H chứa các đỉnh cô lập thì loại chúngkhỏi H Sang bước (4)
(4) Nếu H = , thì kết luận C là chu trình Euler, kết thúc Ngược lại
g d
b a
C D
Trang 11(3) Loại C1 ra khỏi H, ta được đồ thị H như sau
Các đỉnh c và k là các đỉnh cô lập, vì thế ta loại chúng ra khỏi H và nhậnđược đồ thị H sau
(5) Chọn đỉnh chung của H và C là v := f Đặt k := k+1 = 2 Quay lại bước(2)
(2) Ta xây dựng chu trình C2 trong H:
C2 = (f,i,j,h,g,d,b,a,e,f)Nối C2 vào C ta được chu trình C sau
C = C C2 = (f,g,k,h,i,e,b,c,d,f) (f,i,j,h,g,d,b,a,e,f) = (f,g,k,h,i,e,b,c,d,f,i,j,h,g,d,b,a,e,f)
(3) Loại C2 ra khỏi H, ta được đồ thị H gồm toàn các đỉnh cô lập Loạinốt các đỉnh cô lập ta có H =
(4) Vì H = , ta kết luận C là chu trình Euler, kết thúc.
2.3.2 Thuật toán 2 (Fleury)
e
j
g d
b a
e
f
k h i j
g
b a
Trang 12+ Đầu vào Đồ thị G , không có đỉnh cô lập.
+ Đầu ra Chu trình Euler C của G, hoặc kết luận G không có chu trình
- Trường hợp đỉnh v1 không là đỉnh treo:
Nếu mọi cạnh liên thuộc v1 là cầu, thì không có chu trình Euler, kết thúc.
Ngược lại, chọn cạnh (v1 , v2 ) bất kỳ không phải là cầu trong H Thêm vàođường đi C đỉnh v2 Sang bước (4)
(4) Xoá cạnh vừa đi qua, và xoá đỉnh cô lập:
Loại khỏi H cạnh (v1 , v2 ) Nếu H có đỉnh cô lập, thì loại chúng khỏi H Đặt v1 := v2 Sang bước (2)
Ví dụ
Cho G là đồ thị hình sau
Đồ thị liên thông và có các đỉnh bậc chẵn Ta có chu trình Euler sau
(v6, v4, v7, v5, v1, v3, v4, v2, v1, v4, v5, v2, v3, v6)
2.4 Thiết kế cấu trúc dữ liệu và giải thuật tìm đường đi, chu trình Euler
Chương trình được thiết kế bằng ngôn ngữ tựa Pascal
Trang 13- Sử dụng một ngăn xếp CE[max] để lưu chu trình Euler tìm được.
void timdinhle() ; //Tìm các đỉnh lẻ của đồ thị ban đầu
void phanhoach() ; // Dùng để phân hoạch các đỉnh lẻ thành các cặp void Hoanvi ;//sinh ra các hoán vị phân hoạch và chọn phân hoạch tối ưu.
void Themcanh() ; // Thêm cạnh vào đồ thị ban đầu để trở thành đồ thị Euler.
Int duongdi(int s, int d) ; // tìm đường đi ngắn nhất giữa đỉnh s và t
Bước 4 : Từ đồ thị Euler ta đi tìm chu trình Euler
void Euler(dothi G) ; // tìm chu trình Euler
Thủ tục EULER (G: Matran) được thiết kế như sau.
Procedure EULER(G: Matran, CE: Nganxep);
Trang 142.5 Bài toán người đưa thư
2.5.1 Phát biểu bài toán
Bài toán người đưa thư Trung Hoa (Chinese postman problem) phát biểu rằng:
Một người đưa thư xuất phát từ bưu điện phải đến một số con đường đểphát thư rồi quay trở về điểm xuất phát, hỏi người đó phải đi như thế nào để sốđường đi là ít nhất
Trong phần đồ thị, bài toán người đưa thư Trung Hoa tương đương với
bài toán tìm chu trình ngắn nhất đi qua tất cả các cạnh của một đồ thị cho trước.Tên gọi "bài toán người đưa thư Trung Hoa" được Alan Goldman của cục tiêuchuẩn quốc gia Hoa Kỳ (U.S National Bureau of Standards) đặt cho, vì nó đượcnhà toán học Trung Hoa Mei-Ku Guan nêu ra đầu tiên vào năm 1962
Bài toán giải bằng phương pháp đồ thị Dựng một đồ thị có các cạnhtương ứng với các con đường mà người đưa thư phải đi qua Một chu trình đi quatất cả các cạnh gọi là một hành trình Đỉnh xuất phát của chu trình này tương ứngvới vị trí của bưu điện Nếu đồ thị là đồ thị Euler (các đỉnh đều có bậc chẵn) thì
sẽ tồn tại hành trình là chu trình đơn
Ta xét trường hợp đồ thị có một số đỉnh bậc lẻ Như thế hành trình củangười đưa thư sẽ đi qua một số cạnh hai lần
2.5.2 Giải thuật
B1: Khởi tạo Tính tập đỉnh bậc lẻ U, |U|=2k Tính khoảng cách d(u,v) từng cặp phần tử (u,v) của U, min=vô cùng
Trang 15B2: Tìm phân hoạch smin có tổng khoảng cách min.
Với mỗi phân hoạch s gồm k cặp phần tử của U thực hiện
{ Tính tổng T(s) = tổng d(u,v)
Nếu T(s)< min thì đặt min:=T(s) và smin:=s}
B3: Lập đồ thị G’=(V,E’), trong đó E’=E hợp smin Bậc các đỉnh trong G’ có bậc chẵn, suy ra đồ thị G’ có chu trình Euler Tìm chu trình Euler G’ và C’
B4: Thay mỗi cạnh (u,v) thuộc smin bằng đường đi min trong G, ta nhận được lộ trình đưa thư ngắn nhất
2.5.3 Giải thuật mịn
B1: Khởi tạo
//Nhập mảng hai chiều cấp n, với n là số đỉnh
Nhập n;
Nhập tên các đỉnh vào mảng Ten[i] \i=1,n
Nhập trị số cung A[Ten[i],Ten[j]] \i,j=1,n
// D la mang chua khoang cách ngắn nhất hai dinh
// thủ tục disjtra được xd phần sau
End;
B2: Tìm phân hoạch Smin có tổng khoảng cách min
Begin
danhdau[i]=danhdau[j]=False;//chưa đánh dấu
Cap[i,j]=False; //chưa đánh dấu
End;
For k:cặp đỉnh lẻ (i,j) thuộc B do
If(i,j chưa đánh dấu)and (cặp i,j chưa đánh dấu) then
Begin
Tính tổng khoảng cách của phân hoạch
Trang 16//Lưu số thứ tự cặp đỉnh được chọn vào mảng C C[DSC]=k;
if(phần tử của mảng A[Ten[i],Ten[j]] <>0)then
//lưu cặp đỉnh vào mảng dau1[t],cuoi1[t]
while (i<=t-1) và (chưa gặp cạnh có đầu là x)do i:=i+1;
if cạnh có đầu là x then //tìm được đỉnh kề x
Trang 17//c là số đỉnh trong chu trình Euler
While (j<=c) và (cặp đỉnh liền nhau j,j+1 ko thuộc Smin) do
// chia mang CE thanh hai mang con de them vao giua hai mang con // phan duong di thay the duong di ao.
K:=0;
For q:=j+1 to c do // c la so dinh trong mang ce
Begin K:=k+1; ce1[k]:=ce[q] end;
// Dua stack vao sau doan ce bi cat
For h := dodaiP1 downto 1 do
Begin P1[h]ce end;
Nối ce1 vào sau ce;
End.