1
GIỚ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
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
- Đề 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
lục)
Chữ ký
Nhận xét của
giáo viên
1 Nguyễn Duy Linh
2 Nguyễn Thị Hà Phương
3 Nguyễn Trần Sỹ
4 Võ Phi Thanh
5 Hoàng Công Tiến
6 Hoàng Đình Tuyền
Tiểu luận nhóm 1 Trang 2
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
CHƯƠNG 1. ĐẠI CƯƠNG VỀ ĐỒ THỊ
(Sỹ)
Tiểu luận nhóm 1 Trang 3
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
CHƯƠNG 2.
CHU TRÌNH EULER VÀ BÀI TOÁN NGƯỜI ĐƯA THƯ
(Thanh+ Phương)
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.
Ví dụ. Đồ thị
Có chu trình Euler khởi đầu từ đỉnh 1, đi qua tất cả các cạnh và dỉnh
của đồ thị, mỗi cạnh không quá 1 lần và về lại đỉnh 1: (1, 3, 6, 5, 2, 4, 3,
2, 1)
Tiểu luận nhóm 1 Trang 4
1
2
3
4
5 6
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
2.2. Điều kiện cần và đủ
2.2.1. Định lý 1 (Định lý Euler)
Đồ thị G có chu trình Euler khi và chỉ khi G liên thông và mọi đỉnh có
bậc chẵn khác 0.
Chứng minh
(i)(⇒): Giả sử G có chu trình Euler và v là đỉnh bất kỳ của G. Khi đó
chu trình Euler đến v theo cạnh e thì ra khỏi v bằng cạnh e’ ≠ e. Do đó bậc
của v phải là số chẵn. G hiển nhiên là liên thông.
(ii) (⇐): Giả sử G liên thông và mọi đỉnh có bậc chẵn khác 0. Ta
chứng minh 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à
1 khuyê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
1 trong ba khả năng sau:
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ử G
1
chứa a, G
2
chứa b và c. G
1
có chu trình Euler C
1
, G
2
có chu
trình Euler C
2
. Ta xây dựng chu trình Euler C của G như sau. Xuất phát từ
đỉnh a đi theo chu trình C
1
quay về a, sau đó đi theo cạnh x = (a,b) đến
đỉnh b, từ b đi theo chu trình C
2
quay về b, sau đó đi theo cạnh z = (b,c) và
y = (c,a) quay về a.
Tiểu luận nhóm 1 Trang 5
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
G’ có 3 thành phần liên thông G
1
, G
2
và G
3
. Không mất tính tổng
quát giả sử G
1
chứa a, G
2
chứa b và G
3
chứa c. G
1
có chu trình Euler C
1
,
G
2
có chu trình Euler C
2
, G
3
có chu trình Euler C
3
. Ta xây dựng chu trình
Euler C của G như sau. Xuất phát từ đỉnh a đi theo chu trình C
1
quay về a,
sau đó đi theo cạnh x=(a,b) đến đỉnh b, từ b đi theo chu trình C
2
quay về b,
sau đó đi theo cạnh z=(b,c) đến đỉnh c, từ c đi theo chu trình C
3
quay về c,
sau đó đi theo cạnh y=(c,a) quay về a.
- Giả sử G không chứa cạnh z = (b,c)
Xét đồ thị G’ thu được từ G bằng cách loại bỏ 2 cạnh x,y và thêm
cạnh z. Sẽ xảy ra 1 trong hai khả năng sau:
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’. Thay
cạnh z∈ C’ bằng cạnh x và y ta thu được chu trình Euler C của G.
G’ có 2 thành phần liên thông G1 và G2. Không mất tính tổng
quát giả sử G
1
chứa a, G
2
chứa b và c. G
1
có chu trình Euler C
1
, G
2
có chu
trình Euler C
2
. Ta xây dựng chu trình Euler C của G như sau. Thay cạnh
z∈C
2
bằng các cạnh x và y ta có chu trình C
2
’. Nối C
2
’ với C
1
ta thu được
chu trình Euler C của G. (đpcm)
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
đỉnh bậc lẻ. Theo giả thiết quy nạp G’ có n-1 đường đi phủ G’. Gọi P là
đường đi qua cạnh z. Hiển nhiên a, b không phải đỉnh đầu hoặc cuối của P,
Tiểu luận nhóm 1 Trang 6
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
vì vậy nếu bỏ cạnh z ta thu được 2 đường đi P
1
và P
2
cùng với n-2 đường đi
còn lại phủ đồ thị G. (đpcm)
Bây giờ xét đồ thị có hướng G = (V, A). Ký hiệu
R = {u ∈ V : d
I
(v) = d
O
(v)}
S = {u ∈ V : d
I
(v) > d
O
(v)}
T = {u ∈ V : d
I
(v) < d
O
(v)}
Từ bổ đề bắt tay ta có
∑
∈Vv
O
vd )(
=
∑
∈Vv
I
vd )(
⇒
( )
∑
∈
−
Sv
OI
vdvd )()(
=
( )
∑
∈
−
Tv
IO
vdvd )()(
Ta ký hiệu
k =
( )
∑
∈
−
Sv
OI
vdvd )()(
=
( )
∑
∈
−
Tv
IO
vdvd )()(
2.2.3. Định lý 3
(i) Đồ thị có hướng G có chu trình có hướng Euler khi và chỉ khi G
liên thô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)
Ví dụ: Đồ thị
Tiểu luận nhóm 1 Trang 7
A
B
C
D
A
B
C
D
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
Không có chu trình Euler. Ta có
R={u ∈ V | d
I
(v) = d
O
(v) = ∅ }
S= {u ∈ V | d
I
(v) > d
O
(v) } = {C, D}
T= { u ∈ V | d
I
(v) < d
O
(v) } = {A, B}
Và
k =
( )
∑
∈
−
Sv
OI
vdvd )()(
=
( )
∑
∈
−
Tv
IO
vdvd )()(
= 2
Vậy số đường đi có hướng tối thiểu phủ đồ thị là k=2, ví dụ 2 đường
đi sau
(A,C,D,A,B,C) và (B,D)
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ỳ C
k
trong H.
Nếu tồn tại C
k
, nối C
k
vào C, C := C ∪ C
k
. Sang bước (3)
Nếu không tồn tại C
k
, 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 C
k
. Nếu H chứa các đỉnh cô lập. thì loại
chúng khỏ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 sang bước (5)
(5) Nếu H và C không có đỉnh chung, thì kết luận không có chu
trình Euler, kết thúc.
Nếu H và C có đỉnh chung. Chọn v là đỉnh chung của H và C. Đặt
k := k+1. Quay lại bước (2).
Tiểu luận nhóm 1 Trang 8
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
+ Ví dụ
Cho G là đồ thị Thanh mã tấu Mohammed.
Ta áp dụng thuật toán 1 để tìm chu trình Euler.
(1) Đặt H := G, k := 1, C := ∅, v := f.
(2) Ta xây dựng chu trình C
1
trong H:
C
1
= (f,g,k,h,i,e,b,c,d,f)
Đặt C = C ∪ C
1
= (f,g,k,h,i,e,b,c,d,f)
(3) Loại C
1
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
Tiểu luận nhóm 1 Trang 9
e
f
k
h
i
j
g
c
d
b
a
e
f
h
i
j
g
d
b
a
e
f
k
h
i
j
g
c
d
b
a
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
(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 C
2
trong H:
C
2
= (f,i,j,h,g,d,b,a,e,f)
Nối C
2
vào C ta được chu trình C sau
C = C ∪ C
2
= (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 C
2
ra khỏi H, ta được đồ thị H gồm toàn các đỉnh cô lập.
Loại nố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)
+ Đầ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) Chọn đỉnh xuất phát bất kỳ v
0
. Đặt v
1
:= v
0
, C := (v
0
). H := G.
(2) Nếu H = ∅, thì kết luận C là chu trình Euler, kết thúc. Ngược
lại sang bước (3).
(3) Chọn cạnh đi tiếp:
- Trường hợp đỉnh v
1
là đỉnh treo: Tồn tại duy nhất đỉnh v
2
kề v
1
.
Chọn cạnh (v
1
, v
2
). Sang bước (4).
- Trường hợp đỉnh v
1
không là đỉnh treo:
Nếu mọi cạnh liên thuộc v
1
là cầu, thì không có chu trình Euler, kết
thúc.
Ngược lại, chọn cạnh (v
1
, v
2
) bất kỳ không phải là cầu trong H. Thêm
vào đường đi C đỉnh v
2
. Sang bước (4).
Tiểu luận nhóm 1 Trang 10
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
(4) Xoá cạnh vừa đi qua, và xoá đỉnh cô lập:
Loại khỏi H cạnh (v
1
, v
2
). Nếu H có đỉnh cô lập, thì loại chúng khỏi
H.
Đặt v
1
:= v
2
. 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
(v
6
, v
4
, v
7
, v
5
, v
1
, v
3
, v
4
, v
2
, v
1
, v
4
, v
5
, v
2
, v
3
, v
6
)
+ Ví dụ
Domino là một hình chữ nhật chia thành 2 hình vuông mỗi hình
mang một trong các số 0,1,2,3,4,5,6. Hai hình vuông trên một domino có
thể mang cùng một số. Ví dụ
Có tất cả 28 quân Dômino khác nhau. Chứng minh rằng ta có thể sắp
xếp các domino thành hình tròn sao cho hai hình vuông kề nhau trên 2
domino khác nhau sẽ mang cùng số.
Giải:
Ta lập đồ thị 7 đỉnh
v
0
, v
1
, v
2
, v
3
, v
4
, v
5
, v
6
Tiểu luận nhóm 1 Trang 11
v
3
v
6
v
7
v
5
v
4
v
2
v
1
5 6 0 2 4 4
0
1
2
34
6
5
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
Mỗi đỉnh v
i
ứng với số i, i=0, ,6. Mỗi đỉnh có thể nối với các đỉnh
còn lại và chính nó để tạo thành domino.
Ta có đồ thị sau
Liên thông với tất cả các đỉnh có bậc chẵn bằng 6. Do vậy tồn tại chu
trình Euler. Mỗi chu trình Euler sẽ cho tương ứng một cách xếp.
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
Cấu trúc dữ liệu:
- Biểu diễn đồ thị G bằng cấu trúc dữ liệu bởi một ma trận trọng số
A
nxn
. Trong đó n là số đỉnh
- Sử dụng một ngăn xếp Stack[max] để lưu các đỉnh đã đi qua.
- Sử dụng một ngăn xếp CE[max] để lưu chu trình Euler tìm được.
Giải thuật :
Bước 1: Kiểm tra đồ thị có phải là đồ thị liên thông hay không, nếu là
đồ thị liên thông thì chuyển sang bước 2
Hàm lienthong(): Boolean trả về kết quả đúng (True) nều dồ thị liên
thông, sai (False) nếu đồ thị không liên thông.
Bước 1 : Kiểm tra đồ thị là đồ thị Euler hay không phải là đồ thị Euler
(dựa vào bậc của mỗi đỉnh).
Hàm kiemtraEuler() : Boolean để kiểm tra đồ thị Euler.
- Tìm bậc của tất cả các đỉnh của đồ thị G, nếu đều là bậc chẵn thì G là
đồ thị Euler, ngược lại thì không phải.
Bước 2 : Nếu là đồ thị Euler ta đi tìm chu trình Euler
Tiểu luận nhóm 1 Trang 12
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
Thủ tục EULER(dothi G) dùng để tìm chu trình Euler, sau khi tìm thì
chu trình Euler được lưu trong ngăn xếp CE.
Thủ tục EULER (G: Matran) được thiết kế như sau.
Procedure EULER(G: Matran, CE: Nganxep);
Begin
v, x, top: Int //bien top: dinh stack
top=1;
stack[top]=u; // tim chu trinh bat dau tu dinh u
Do
Begin
V := stack[top]; // v la dinh dau stack
x:=1;
While (x<=n && A[v][x]==0) // tim dinh x ke v
x:=x+1;
if (x>n) // neu khong dinh x nao ke dinh v
Begin
//lay dinh v ra khoi stack va dua dinh v vao ngan xep CE
dCE :=dCE+1; //
CE[dCE] :=v;
top :=top-1;
End
Else // co dinh x ke dinh v
Begin
// dua dinh x vao stack dong thoi xoa canh (v,x) ra khoi do thi.
top:=top+1;
stack[top]:=x;
A[v,x]:=A[x,v]:=0;
End
End while(top<>0); // Ham Euler thuc hien trong khi stack chua rong.
End.
2.5. Bài toán người đưa thư
Tiểu luận nhóm 1 Trang 13
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
CHƯƠNG III. CÀI ĐẶT BÀI TOÁN NGƯỜI ĐƯA THƯ
(Linh+Tuyền)
Tiểu luận nhóm 1 Trang 14
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
KẾT LUẬN
Trên cơ sở nghiên cứu kiến thức từ giáo trình “Toán ứng dụng” của Thầy
giáo PGS.TSKH Trần Quốc Chiến và một số tài liệu liên quan, nhóm chúng tôi
thực hiện đề tài “Chu trình Euler và bài toán người đưa thư ” đã đạt được những
kết quả sau:
- Tìm hiểu thuật toán tìm chu trình Euler và thuật 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 của bài toán người đưa thư
- Đề xuất cấu trúc dữ liệu biểu diễn hai bài toán.
- Cài đặt hoàn chỉnh thuật toán bài toán người đưa thư trên ngôn ngữ
Pascal
Chúng tôi xin chân thành cảm ơn Thầy giáo PGS.TSKH Trần Quốc
Chiến đã tận tình giúp đỡ chúng tôi hoàn thành tiểu luận này.
Do trình độ và thời gian hạn chế nên không tránh khỏi khiếm khuyết,
rất mong nhận được sự góp ý của Thầy, Cô và các bạn để tiểu luận được
hoàn thiện hơn.
Tiểu luận nhóm 1 Trang 15
Toán ứng dụng Chu trình Euler và bài toán người đưa thư
TÀI LIỆU THAM KHẢO
1. PGS. TSKH Trần Quốc Chiến,
Giáo trình Toán ứng dụng, Đại học Đà Nẵng 2010.
2. PGS. TSKH Trần Quốc Chiến,
Giáo trình Lý thuyết đồ thị, Đại học Đà Nẵng 2005.
3. Nguyễn Đức Nghĩa, Nguyễn Tô
Thành. Toán rời rạc. Nhà xuất bản Giáo dục, 1999.
Tiểu luận nhóm 1 Trang 16