Tải bản đầy đủ (.doc) (87 trang)

BÀI TOÁN NGƯỜI đưa THƯ và ỨNG DỤNG ở CÔNG TY môi TRƯỜNG đô THỊ QUẢNG BÌNH

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.78 MB, 87 trang )

MỤC LỤC
MỞ ĐẦU..........................................................................................................1
1. Tính cấp thiết của đề tài........................................................................1
2. Mục tiêu nghiên cứu..............................................................................2
3. Đối tượng và phạm vi nghiên cứu.........................................................2
4. Phương pháp nghiên cứu.......................................................................2
5. Bố cục của đề tài...................................................................................3
CHƯƠNG 1. BÀI TOÁN NGƯỜI ĐƯA THƯ..............................................4
1.1. ĐẠI CƯƠNG VỀ ĐỒ THỊ.........................................................................4
1.1.1. Đồ thị, đỉnh, cạnh, cung..................................................................4
1.1.2. Bậc, nửa bậc vào, nửa bậc ra...........................................................5
1.1.3. Đường đi, chu trình , tính liên thông...............................................9
1.2. CHU TRÌNH EULER...............................................................................10
1.2.1. Định nghĩa.....................................................................................10
1.2.2. Điều kiện cần và đủ.......................................................................11
1.2.3. Các thuật toán tìm chu trình Euler................................................15
1.3. BÀI TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT.........................................20
1.3.1. Phát biểu bài toán..........................................................................20
1.3.2. Thuật toán Dijkstra........................................................................20
1.3.3. Thuật toán Floyd...........................................................................21
1.3.4. Thuật toán Floyd –Warshall..........................................................26
1.4. BÀI TOÁN NGƯỜI ĐƯA THƯ..............................................................28
1.4.1. Phát biểu bài toán..........................................................................28
1.4.2. Thuật toán tìm lộ trình đưa thư ngắn nhất.....................................29
1.5. TỔNG KẾT CHƯƠNG 1.........................................................................31


CHƯƠNG 2. ỨNG DỤNG Ở CÔNG TY MÔI TRƯỜNG ĐÔ THỊ
QUẢNG BÌNH...............................................................................................32
2.1. MÔ TẢ BÀI TOÁN THỰC TẾ................................................................32
2.2.MAPINFO VÀ CÔNG CỤ LẬP TRÌNH MAPXTREME........................32


2.2.1. Tìm hiểu về Mapinfo.....................................................................32
2.2.2. Mapxtreme....................................................................................37
2.3. SƠ ĐỒ MẠNG LƯỚI GIAO THÔNG THÀNH PHỐ ĐỒNG HỚI........58
2.3.1. Bản đồ...........................................................................................58
2.3.2. Sơ đồ mạng lưới giao thông..........................................................59
2.4. TỔNG KẾT CHƯƠNG 2.........................................................................60
CHƯƠNG 3. THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH....................61
3.1. THIẾT KẾ CHƯƠNG TRÌNH.................................................................61
3.1.1. Yêu cầu của chương trình..............................................................61
3.1.2. Thiết kế cơ sở dữ liệu....................................................................61
3.2. ỨNG DỤNG BÀI TOÁN NGƯỜI ĐƯA THƯ CÀI ĐẶT CHƯƠNG
TRÌNH.............................................................................................................62
3.3.THỬ NGHIỆM VÀ ĐÁNH GIÁ KẾT QUẢ............................................63
3.3.1. Giao diện chương trình..................................................................64
3.3.2. Phóng to, thu nhỏ, di chuyển bản đồ.............................................65
3.3.3. Chọn lớp, thêm, sửa, xoá một đối tượng.......................................66
3.3.4. Tìm kiếm lộ trình đi......................................................................70
3.3.5. Đánh giá phần mềm.......................................................................75
3.4.TỔNG KẾT CHƯƠNG 3..........................................................................77
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN...................................................78
TÀI LIỆU THAM KHẢO............................................................................79
QUYẾT ĐỊNH GIAO ĐỀ TÀI LUẬN VĂN (bản sao)



DANH MỤC CÁC CHỮ VIẾT TẮT

RLC

Common Language Runtime


SDK

Software Development Kit

SQL

Structured Query Language

RDBMS

relational database management systems

MS

Microsoft Office

UML

Unified Modeling Language


DANH MỤC CÁC BẢNG

Số hiệu
bảng

Tên bảng

Trang


3.1

Bảng nút giao thông

61

3.2

Bảng tuyến giao thông

62


DANH MỤC CÁC HÌNH
Số hiệu
hình
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
2.1
2.2
2.3
2.4
2.5

2.6
2.7
2.8
2.9
2.10
2.11
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11

Tên hình

Trang

Đồ thị vô hướng
Đồ thị có hướng
Đồ thị có đỉnh treo
Đồ thị đủ
Đồ thị Euler
Đồ thị Thanh mã tấu Mohammed
Đồ thị liên thông có các đỉnh bậc chẵn
Đồ thị có trọng số

Đối tượng đường
Đối tượng vùng
Bản đồ lớp
Biểu diễn bằng theme
sơ đồ minh họa các lớp cài đặt giao diện Isession
Sơ đồ MapInfo.Mapping namespace
Các Layer được biễu diễn bằng một sơ đồ UML
Sơ đồ UML minh họa namespace Find
Sơ đồ UML dưới đây biểu diễn mô hình lớp

4
4
6
8
11
16
18
29
35
36
41
42
48
50
51
55

Geometry
Bản đồ giao thông thành phố Đồng Hới
Hình 2.11 Mô hình hóa bằng đồ thị

Giao diện chương trình
Chức năng phóng to chương trình
Chức năng thu nhỏ chương trình
Chọn lớp bản đồ cần chỉnh sữa
Chọn lớp bản đồ để chỉnh sữa một đối tượng
Chọn thay đổi kiểu đối tượng
Chức năng load đường đi cho xe thu gom rác
Chức năng đọc dữ liệu từ file
Mô phỏng đường đi trên bản đồ
Lưu hành trình của xe thu gom rác
In tuyến đường đi trên bản đồ

57
58
59
64
65
66
67
69
70
71
72
73
74
75


1


MỞ ĐẦU
1.

Tính cấp thiết của đề tài
Cuộc sống con người ngày càng được cải thiện và nâng cao chất lượng,
cùng với sự phát triển đó thì lượng rác thải hàng ngày mà chúng ta thải ra môi
trường cũng ngày càng nhiều hơn. Một trong các cách để thu gom rác hiệu
quả là sử dụng xe chở rác. Tuy nhiên với mạng lưới giao thông phức tạp và
chằng chéo nhau trên địa bàn Thành phố Đồng Hới thì việc di chuyển qua lại
quá nhiều sẽ ảnh hưởng đến giao thông cũng như các lợi ích kinh tế. Vấn đề
đặt ra là tìm hành trình tối ưu sao cho đường đi của xe rác là ngắn nhất.
Các bài toán đặt ra trong các ứng dụng như vậy thường có cơ sở dữ liệu
lớn nên việc rút ngắn thời gian tính toán để trả lời một câu truy vấn có ý nghĩa
thực tiễn cao. Ngoài ra trong thực tế, các đồ thị được sử dụng trong các bài
toán có thể liên tục thay đổi theo thời gian, ví dụ như các đỉnh hay các cạnh
của nó có thể được thêm vào hay xóa đi (đồ thị động), hoặc thay đổi độ dài,
lượng thông qua...
Mỗi lần có một thay đổi như vậy cấu trúc dữ liệu của bài toán, thông tin
về các đỉnh cũng như các cạnh cũng bị thay đổi theo. Trong khi đó yêu cầu
đặt ra là phải liên tục trả lời các câu hỏi về thông tin trong đồ thị như tính liên
thông của đồ thị, rừng bao trùm tối thiểu, 2 đỉnh bất kỳ có nằm trên cùng một
cây bao trùm tối thiểu hay không, đường đi ngắn nhất... Một cách tiếp cận để
giải quyết các bài toán trên đồ thị động là sử dụng các cấu trúc dữ liệu và
thuật toán truyền thống trong đồ thị tĩnh và chạy lại chúng mỗi khi có sự thay
đổi trong đồ thị.
Tuy nhiên cách tiếp cận như vậy không tận dụng được thông tin của đồ
thị trước khi thay đổi dẫn đến độ phức tạp để trả lời một câu truy vấn về đồ thị
sau mỗi bước thay đổi là lớn.



2

Xuất phát từ lý do trên, tôi đã thực hiện đề tàì “BÀI TOÁN NGƯỜI ĐƯA
THƯ VÀ ỨNG DỤNG Ở CÔNG TY MÔI TRƯỜNG ĐÔ THỊ QUẢNG
BÌNH” Trong đề tài này tôi đã trình bày các nghiên cứu, khảo sát thực
nghiệm và ứng dụng một số cấu trúc dữ liệu được đưa ra gần đây để giúp
quản lý các đồ thị động một cách mềm dẻo.
2.

Mục tiêu nghiên cứu :
oNghiên cứu lý thuyết đồ thị và ứng dụng.
oNghiên cứu cụ thể về các thuật toán tìm đường đi trên đồ thị, đặc biệt là
thuật toán giải bài toán người đưa thư.
oPhân tích và cài đặt thuật toán người đưa thư.
oViết chương trình tìm đường đi cho xe thu gom rác, và thể hiện kết quả
oCài đặt ứng dụng cho công ty môi trường đô thị Quảng Bình.

3.

Đối tượng và phạm vi nghiên cứu
 Đối tượng nghiên cứu
o Tìm hiểu công tác có những bất cập, thiếu sót để đề ra giải pháp
theo yêu cầu nhằm đem lại hiệu quả cao hơn.
o Nghiên cứu các vấn đề về đồ thị và bài toán người đưa thư.
o Triển khai xây dựng phần mềm ứng dụng.
o Đánh giá khả năng ứng dụng của phần mềm.
 Phạm vi nghiên cứu
o Các vấn đề về đồ thị.
o Ứng dụng tìm hành trình tối ưu nhất cho xe gom rác ở công ty môi
trường đô thị Quảng Bình


4.

Phương pháp nghiên cứu
Đề tài này sẽ kết hợp hai phương pháp nghiên cứu, đó là:


3

 Phương pháp nghiên cứu lý thuyết
o Nghiên cứu lý thuyết và một số thuật toán trên đồ thị.
o Nghiên cứu bài toán người đưa thư.
 Phương pháp nghiên cứu thực nghiệm
o Sử dụng phương pháp nghiên cứu lý thuyết kết hợp với nghiên cứu
thực nghiệm:
o Biểu diễn bài toán thực tế trên đồ thị
o Triển khai xây dựng các giải pháp và ứng dụng bài toán người đưa
thư vào thực tế.
o Chạy thử nghiệm và lưu trữ các kết quả đạt được, sau đó đánh giá
lại kết quả.
5.

Bố cục của đề tài
Sau phần mở đầu, luận văn gồm có 3 chương và phần kết luận. Các
chương của luận văn bao gồm:
CHƯƠNG 1. BÀI TOÁN NGƯỜI ĐƯA THƯ
CHƯƠNG 2. ỨNG DỤNG Ở CÔNG TY MÔI TRƯỜNG ĐÔ THỊ QUẢNG
BÌNH
CHƯƠNG 3. THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH
Phần kết luận, tổng hợp các kết quả nghiên cứu của luận văn. Các kết

quả đạt được, hạn chế của luận văn, đề xuất hướng phát triển tiếp theo cho đề
tài.


4

CHƯƠNG 1

BÀI TOÁN NGƯỜI ĐƯA THƯ
1.1. ĐẠI CƯƠNG VỀ ĐỒ THỊ
1.1.1. Đồ thị, đỉnh, cạnh, cung
 Đồ 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ự).
v

w
e

+ Ví dụ:

Hình 1.1. Đồ thị vô hướng.
 Đồ 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ự.
v

w
e

+ Ví dụ


Hình 1.2. Đồ thị có hướng.


5

Cho đồ thị có hướng G=(V, E). Nếu ta thay mỗi cung của G bằng một
cạnh, thì đồ thị vô hướng nhận được gọi là đồ thị lót của G.
+ Ghi chú. Đồ thị vô hướng có thể coi là đồ thị có hướng trong đó mỗi cạnh e
= (v,w) tương ứng với hai cung (v,w) và (w,v).
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.
Nếu có nhiều cạnh liên kết với cùng một cặp đỉnh thì ta nói đó là các
cạnh song song.
Cạnh có hai đỉnh liên kết trùng nhau gọi là khuyên.
Đỉnh không kề với đỉnh khác gọi là đỉnh cô lập.
Số đỉnh của đồ thị gọi là bậc của đồ thị, số cạnh hoặc số cung của đồ thị
gọi là cỡ của đồ thị.
 Đồ thị hữu hạn là đồ thị có bậc và cỡ hữu hạn.
 Đồ thị đơn là đồ thị không có khuyên và không có cạnh song song.
 Đồ thị vô hướng đủ là đồ thị mà mọi cặp đỉnh đều kề nhau.
 Đồ thị có hướng đủ là đồ thị có đồ thị lót đủ.
1.1.2. Bậc, nửa bậc vào, nửa bậc ra
Cho đồ thị G = (V, E).
 Bậc của đỉnh vV là tổng số cạnh liên thuộc với nó và ký hiệu là d(v).
Nếu đỉnh có khuyên thì mỗi khuyên được tính là 2 khi tính bậc, như

vậy
d(v) := Số cạnh liên thuộc v + 2*Số khuyên


6

Từ định nghĩa suy ra đỉnh cô lập trong đồ thị đơn là đỉnh có bậc bằng 0.
Số bậc lớn nhất của G ký hiệu là (G), số bậc nhỏ nhất của G ký hiệu
là (G).
 Đỉnh treo là đỉnh có bậc bằng 1.
 Nửa bậc
Cho G=(V,E) là đồ thị có hướng, v  V. nửa bậc ra của đỉnh v, ký hiệu là
dO(v), là số cung đi ra từ đỉnh v (v là đỉnh đầu), và nửa bậc vào của đỉnh vV,
ký hiệu là dI(v), là số cung đi tới đỉnh v (v là đỉnh cuối).
+ Ví dụ
x2
e1

x6
e4

x1

x4
e2
e3
0

x3


x5

Hình 1.3. Đồ thị có đỉnh treo.
Trong đồ thị này ta có
d(x1) = 6;

d(x2) = d(x3) = 4; d(x4) = 3;

d(x5) = 0;

Đỉnh x1 có hai khuyên liên thuộc.
Có hai cạnh song song liên thuộc đỉnh x2 và x3.
Đỉnh x5 là đỉnh cô lập.
Đỉnh x6 là đỉnh treo.

d(x6) = 1


7

+ Ví dụ
Xét đồ thị có hướng sau :
x2

x6

x1
x4
x3


x5

Trong đồ thị có hướng này ta có
dI(x1) = 0;

dO(x1) = 2; dI(x2) = 1;

dO(x2) = 2;

dI(x3) = 2;

dO(x3) = 1; dI(x4) = 2;

dO(x4) = 2;

dI(x5) = 1;

dO(x5) = 1; dI(x6) = 2;

dO(x6) = 0;

 Bổ đề bắt tay (Hand Shaking Lemma)
Cho đồ thị G = (V,E). Khi đó
(i) Tổng bậc các đỉnh của đồ thị là số chẵn và

 d (v )
vV

= 2.card(E)


(ii) Nếu G là đồ thị có hướng thì

d
vV

O

(v ) =

 d (v )
I

vV

= card(E)

trong đó card(E) ký hiệu số phần tử của tập X.
Chứng minh
(i) Mỗi cạnh e = (u, v)  E tham gia tính 1 bậc của đỉnh u và 1 bậc của đỉnh v.
Từ đó suy ra công thức (i)
(ii) Mỗi cung e = (u, v)  E tham gia tính 1 bậc ra của đỉnh u và 1 bậc vào
của đỉnh v. Từ đó suy ra công thức (ii)
Hệ quả. Số đỉnh bậc lẻ của đồ thị vô hướng là số chẵn.


8

Chứng minh
Cho đồ thị G = (V,E). Ký hiệu V 1 là tập số đỉnh bậc lẻ, V 2 là tập số đỉnh
bậc chẵn. Theo bổ đề ta có

2. card(E) =


 d (v )

 d (v )

 d (v )

=

 d (v )

= 2. card(E) 

vV

vV1

vV1

+

vV2

 d (v )

vV2

là số chẵn. Các số hạng d(v) trong tổng

tổng

 d (v )

vV1

 d (v )

vV1

đều là số lẻ. Vì vậy để cho

là số chẵn thì số các số hạng đó phải là số chẵn, tức card(V1) là

số chẵn. Suy ra số đỉnh bậc lẻ trong V là số chẵn.
+ Ghi chú : Bổ đề trên có tên bổ đề bắt tay từ bài toán thực tế sau:
Trong một hội thảo, các đại biểu bắt tay nhau. Khi đó tổng số lần bắt tay
của tất cả đại biểu bao giờ cũng là số chẵn.
 Đồ thị Kn là đồ thị đơn, đủ n đỉnh (mỗi cặp đỉnh đều có duy nhất một
cạnh liên kết).
Ví dụ sau đây là đồ thị K5

Hình 1.4. Đồ thị đủ.
 Mệnh đề. Mọi đỉnh của đồ thị Kn có bậc n1 và Kn có n(n1)/2 cạnh.
1.1.3. Đường đi, chu trình , tính liên thông


9

 Cho ®å thị G=(V,E).

Dãy  từ đỉnh v đến w là dãy các đỉnh và cạnh nối tiếp nhau bắt đầu từ
đỉnh v và kết thúc tại đỉnh w. Số cạnh trên dãy  gọi là độ dài của dãy  .
Dãy  từ đỉnh v đến đỉnh w độ dài n được biểu diễn như sau

  (v, e1 , v1 , e2 , v2 ,..., vn1 , en , w)
trong đó vi(i=1,2…,n-1) là các đỉnh trên dãy và ei(i=1,2…,n) là các cạnh
trên dãy liên thông thuộc đỉnh kề trước và sau nó. Các đỉnh và cạnh trên có
thể lặp lại.
Đường đi từ đỉnh v đến w là dãy từ đỉnh v đến 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
Vòng là dãy có đỉnh đầu và đỉnh cuối trùng nhau.
Chu trình là đường đi 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á 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,…,en) thỏa mãn đỉnh cuối của cung ei là đỉnh đầu của cung ei+1,
i=1,..n-1.
Đườ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.
Vòng có hướng là dãy có hướng 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 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 .


10


Đồ thị có 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.
 Định lí 1:
(i)

Trong đồ thị vô hướng mỗi dãy từ đỉnh v đến w chứa đường đi
sơ cấp từ v đến w.

(ii)

Trong đồ thị có hướng mỗi dãy có hướng từ đỉnh v đến w chứa
đường đi có hướng sơ cấp từ v đến w.

 Định lí 2: Đồ thị G lưỡng phân khi và chỉ khi G không chứa chu trình
độ dài lẻ.
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ố.
Trọng đồ được biểu diễn bởi G=(V,E,w), trong đó V là 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 đó.
1.2. CHU TRÌNH EULER
1.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.


11

Đườ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ị
1

3

2

4
5

6

H×nh 1.5. §å thÞ Euler.
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)

1.2.2. Điều kiện cần và đủ
 Đị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 c


12

hẵ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à G2. 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 chu trình C 1 quay về a, sau đó đi


13

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.
 G’ có 3 thành phần liên thông G1 , G2 và G3. Không mất tính tổng
quát giả sử G1 chứa a, G2 chứa b và G3 chứa c. G1 có chu trình
Euler C1, G2 có chu trình Euler C2 , G3 có chu trình Euler C3. 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 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)
đến đỉnh c, từ c đi theo chu trình C3 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ử 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. Thay cạnh zC2 bằng các cạnh x và y ta có chu trình C2’. Nối
C2’ với C1 ta thu được chu trình Euler C của G.

(đpcm)

 Đị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.


14

(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, vì vậy
nếu bỏ cạnh z ta thu được 2 đường đi P 1 và P2 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 : dI(v) = dO(v)}
S = {u  V : dI(v) > dO(v)}
T = {u  V : dI(v) < dO(v)}
Từ bổ đề bắt tay ta có

d
vV

O

(v ) =

 d (v )
I

vV



Ta ký hiệu k =

  d (v )  d
I

vS

  d (v )  d
I


vS

O

O

(v )  =

(v )  =

 d

O

(v )  d I ( v ) 

vT

 d

O

(v )  d I ( v ) 

vT

 Đị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.


15

Ví dụ: Đồ thị
A

B

D

C

Đồ thị trên có chu trình Euler: (A,B,C,D,A).
Ví dụ: Đồ thị
A

B

D

C

Không có chu trình Euler. Ta có
R={u  V | dI(v) = dO(v) =  }
S= {u  V | dI(v) > dO(v) } = {C, D}
T= { u  V | dI(v) < dO(v) } = {A, B}


k=

  d (v )  d
I

vS

O

(v )  =

 d
vT

O

(v )  d I (v )  = 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)
1.2.3. Các thuật toán tìm chu trình Euler
 Thuật toán 1
+ Đầu vào. Đồ thị G  , không có đỉnh cô lập.


16

+ Đầ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.
Loại khỏi H chu trình Ck. Nếu H chứa các đỉnh cô lập. thì loại chúng khỏi H.
Sang bước (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).
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).
+ Ví dụ
Cho G là đồ thị Thanh mã tấu Mohammed.
a

e
b

c

d

j
f

i
h
g


k

Hình 1.6. Đồ 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 C1 trong H:
C1 = (f,g,k,h,i,e,b,c,d,f)


17

Đặt C = C  C1 = (f,g,k,h,i,e,b,c,d,f)
(3)

Loại C1 ra khỏi H, ta được đồ thị H như sau
a

j

e

f

b


h
g

d

c

i
k

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
a

j

e

f

b

i
h
g

d

(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ạ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.

 Thuật toán 2 (Fleury)


18

+ Đầ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ỳ v0 . Đặt v1 := v0 , C := (v0). 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 v1 là đỉnh treo: Tồn tại duy nhất đỉnh v2 kề v1 .

-

Chọn cạnh (v1 , v2 ). Sang bước (4).
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


v1
v2

v3
v6

v4

v5
v7

Hình 1.7. Đồ thị liên thông và có các đỉnh bậc chẵn


19

Đồ 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)
+ 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ụ

5 6

0 2

4 4

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
v0, v1, v2, v3, v4, v5, v6
Mỗi đỉnh vi ứ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
0

6

1

5

2

4

3


×