Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 15

Trường đại học Khoa học Tự nhiên

Khoa Toán – Cơ – Tin học

BÁO CÁO
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Chu trình Euler của đồ thị

Giảng viên hướng dẫn:


PGS. TS. Nguyễn Thị Hồng Minh
TS. Phạm Huy Thông

Sinh viên: Lâm Thu Mi – 18001162


Nguyễn Thị Thu Hà – 18001122
Vũ Thị Thu Hằng – 18001126

HÀ NỘI, NGÀY 10 THÁNG 6 NĂM 2020


Chu trình Euler của đồ thị

Nội dung
I.Giới thiệu về Graph
1. Graph là gì?
2. Cấu trúc dữ liệu cho Graph
3. Ứng dụng
II.Đồ thị Euler
1.Giới thiệu
2. Các định nghĩa về đường đi Euler và chu trình Euler
3. Bài toán tìm chu trình Euler
a. Thuật toán Hierholzer
- Triển khai
- Ví dụ
b. Thuật toán Fleury
- Triển khai
- Ví dụ
4. Ứng dụng
Nguồn tham khảo:
https://www.geeksforgeeks.org/hierholzers-algorithm-directed-graph/
https://www.geeksforgeeks.org/fleurys-algorithm-for-printing-eulerian-path/
Data Structures and Algorithms in Java - Michael T. Goodrich, Roberto
Tamassia and Michael H.Goldwasser (Chapter 14)

I. Giới thiệu về Graph

1|Trang
Chu trình Euler của đồ thị

1. Khái niệm đồ thị, các định nghĩa liên quan


Đồ thị là một tập các đối tượng gọi là đỉnh nối với nhau bởi
các cạnh. Thông thường, đồ thị được vẽ dưới dạng một tập các điểm
(đỉnh, nút) nối với nhau bởi các đoạn thẳng (cạnh). Tùy theo ứng dụng mà
một số cạnh có thể có hướng

 Đồ thị vô hướng: là đồ thị không có sự phân biệt giữa hai đỉnh được
liên kết với mỗi cạnh hai chiều
 Đồ thị có hướng: là đồ thị được tạo thành từ tập hợp các đỉnh được
nối bởi các cạnh, trong đó các cạnh có hướng liên kết với chúng.

Đồ thị vô hướng Đồ thị có hướng

2|Trang
Chu trình Euler của đồ thị

 Đồ thị có thể có trọng số (bằng cách gán trọng số cho mỗi cạnh, biểu
thị các giá trị số liên quan đến kết nối đó) hoặc đồ thị có thể không có
trọng số (tất cả các cạnh có trọng số đơn vị 1 hoặc tất cả các cạnh có
cùng trọng số không đổi)

Đồ thị có trọng số

2. Graph ADT

 numVertices (): Trả về số đỉnh của đồ thị


 vertices (): Trả về số lần lặp của tất cả các đỉnh của đồ thị
 numEdges (): Trả về số cạnh của đồ thị
 edge (): Trả về số lần lặp của tất cả các cạnh của đồ thị
 getEdge (u, v): Trả về cạnh từ đỉnh u sang đỉnh v, nếu tồn tại; nếu
không thì trả về null. Đối với một đồ thị vô hướng, không có sự khác
biệt giữa getEdge (u, v) và getEdge (v, u)
 endVertices (e): Trả về một mảng chứa hai đỉnh điểm cuối của cạnh
e. Nếu là đồ thị có định hướng, đỉnh đầu tiên là gốc và thứ hai là đích
 opposite (v, e): Đối với cạnh e tới đỉnh v, trả về đỉnh khác của cạnh;
một lỗi xảy ra nếu e không tới v.
 outDegree (v): Trả về số lượng các cạnh đi ra từ đỉnh v

3|Trang
Chu trình Euler của đồ thị

 inDegree (v): Trả về số lượng các cạnh đi vào đỉnh v. Với một đồ thị
vô hướng, sẽ trả về cùng giá trị như outDegree (v)
 outgoingEdges (v): Trả về số lần lặp của tất cả các cạnh đi ra từ
đỉnh v.
 incomingEdges (v): Trả về số lần lặp của tất cả các cạnh vào đỉnh
v. Đối với một đồ thị vô hướng, trả về cùng một tập như
outgoingEdges(v).
 insertVertex (x): Tạo và trả về một đỉnh mới với phần tử là x.
 insertEdge (u, v, x): Tạo và trả về một cạnh mới từ đỉnh u đến đỉnh
v, lưu trữ phần tử x; một lỗi xảy ra nếu đã tồn tại một cạnh từ u đến v
 removeVertex (v): Loại bỏ đỉnh v và tất cả các cạnh của nó khỏi đồ
thị
 removeEdge (e): Loại bỏ cạnh e khỏi đồ thị

3. Cấu trúc dữ liệu cho Graph:

 Ma trận liền kề

 Danh sách liền kề


 Danh sách cạnh

4. Duyệt đồ thị

 Thuật toán duyệt theo chiều sâu (Deep First Search – DFS)
 Thuật toán duyệt theo chiều rộng (Breadth First Search – BFS)

4|Trang
Chu trình Euler của đồ thị

5. Ứng dụng của Graph trong thực tế

 Hệ thống phân phối hàng của chuỗi siêu thị Vinmart.


 Hệ thống cấp tiền cho các cây ATM của ngân hàng BIDV.
 Hệ thống đưa đón học sinh cho trường phổ thông dân lập Đoàn Thị
Điểm.

II. Đồ thị Euler

1. Giới thiệu
Bài toán bảy cây cầu ở Konigsberg: Konigsberg gồm 2 hòn đảo lớn
nối với nhau và với đất liền bởi bảy cây cầu. Bài toán đặt ra là tìm một
tuyến đường mà đi qua mỗi cây cầu một lần và chỉ đúng một lần (bất kể
điểm xuất phát hay điểm tới).

5|Trang
Chu trình Euler của đồ thị

Hình ảnh 7 chiếc cầu nối 4 vùng trong thành phố Konigsberg (Đức)

Năm 1736, Leonhard Euler đã đã phát biểu bài toán bằng các thuật
ngữ của lý thuyết đồ thị và chứng minh rằng bài toán này là không có lời
giải. Ông loại bỏ tất cả các chi tiết ngoại trừ các vùng đất và các cây cầu,
sau đó thay thế mỗi vùng đất bằng một điểm, gọi là đỉnh hoặc nút, và thay
mỗi cây cầu bằng một đoạn nối, gọi là cạnh hoặc liên kết. Cấu trúc toán
học thu được được gọi là một đồ thị.

Đồ thị vô hướng được mô hình hóa từ bài toán 7 chiếc cầu

Euler nhận ra rằng bài toán có thể được giải bằng cách sử
dụng bậc của các nút. Bậc của một nút là số cạnh nối với nó; trong đồ thị
các cây cầu Konigsberg, ba nút có bậc bằng 3 và một nút có bậc 5. Euler
đã chứng minh rằng một chu trình có dạng như mong muốn chỉ tồn tại khi

6|Trang
Chu trình Euler của đồ thị

và chỉ khi không có nút bậc lẻ. Một đường đi như vậy được gọi là một chu
trình Euler. Do đồ thị các cây cầu Konigsbergcó bốn nút bậc lẻ, nên nó
không thể có chu trình Euler.

2. Các định nghĩa về đường đi Euler và chu trình Euler


Đường đi Euler trong đồ thị vô hướng là đường đi của đồ thị đi qua
mỗi cạnh của đồ thị đúng một lần (nếu là đồ thị có hướng thì đường đi phải
tôn trọng hướng của cạnh). Một đồ thị có đường đi Euler được gọi là đồ thị
nửa Euler.

Chu trình Euler trong đồ thị vô hướng là một chu trình đi qua mỗi
cạnh của đồ thị đúng một lần và có đỉnh đầu trùng với đỉnh cuối

Dây chuyền Euler: dây chuyền đi qua tất cả các cạnh trong đồ thị,
mỗi cạnh được đi qua đúng một lần

Mạch Euler: đường đi Euler có đỉnh đầu trùng với đỉnh cuối

Đồ thị Euler:

 Đồ thị Euler vô hướng là đồ thị vô hướng có chứa ít nhất một


chu trình Euler.
 Đồ thị Euler có hướng là đồ thị có hướng có chứa ít nhất một
mạch Euler.

Đồ thị Euler có đường đi Euler : B-A-C-B-D

7|Trang
Chu trình Euler của đồ thị

 Tính liên thông của đồ thị


 Một đồ thị vô hướng được gọi là liên thông nếu luôn tồn tại đường
đi giữa mọi cặp đỉnh phân biệt của đồ thị.
 Một đồ thị có hướng được gọi là liên thông mạnh nếu luôn tồn tại
đường đi (theo các cung định hướng) giữa hai đỉnh bất kỳ của đồ thị
và được gọi là liên thông yếu nếu đồ thị vô hướng nền của nó là liên
thông.
 Điều kiện để đồ thị tồn tại chu trình Euler và đường đi Euler
 Một đồ thị vô hướng liên thông có chu trình Euler khi và chỉ khi mọi
đỉnh của nó đều có bậc chẵn.
 Một đồ thị vô hướng liên thông có đường đi Euler nhưng không có
chu trình Euler khi và chỉ khi nó có đúng 2 đỉnh bậc lẻ.
 Một đồ thị có hướng liên thông yếu có chu trình Euler thì mọi đỉnh
của nó có bán bậc ra bằng bán bậc vào.
 Một đồ thị có hướng liên thông yếu G = (V, E) có đường đi Euler
nhưng không có chu trình Euler nếu tồn tại đúng hai đỉnh u, v ∈ V
sao cho deg+ (u) - deg- (u) = deg- (v) - deg+ (v) = 1, còn tất cả những
đỉnh khác u và v đều có bán bậc ra bằng bán bậc vào.

3. Bài toán tìm chu trình Euler


Bài toán: Tìm chu trình Euler trong một đồ thị Euler (đồ thị đã có tính liên
thông và mọi đỉnh đều có bậc chẵn) cho trước

 Input: Đồ thị Euler G = (V, E)


 Output: Chu trình Euler trong G

8|Trang
Chu trình Euler của đồ thị

Thuật toán:

 Thuật toán Hierholzer


 Thuật toán Fleury

a. Thuật toán Hierholzer

 Thuật toán giả sử rằng đồ thị đã cho có mạch Euler. Các bước của
thuật toán:
o Chọn một đỉnh v bất kì để bắt đầu và đi theo các cạnh từ đỉnh
đó cho đến khi quay lại trở về v. Đường đi không thể dừng tại
bất kỳ đỉnh nào khác v, bởi vì bậc ra và bậc vào của mọi đỉnh
phải giống nhau, khi đường mòn đi vào một đỉnh w khác, phải
có một cạnh không sử dụng để lại w. Đường đi này là 1 đường
đi kín, nhưng có thể không đi qua tất cả các đỉnh và cạnh của
đồ thị ban đầu.
o Khi tồn tại một đỉnh u thuộc đường đi hiện tại, nhưng các cạnh
liền kề không phải là một phần của đường đi, ta sẽ bắt đầu một
đường đi khác từ u, theo các cạnh không được sử dụng cho
đến khi trở về u và đường đi này được hình thành từ trước.
o Tiếp tục đường đi tới các cạnh chưa đi qua và loại bỏ chúng
cho đến khi không còn cạnh sử dụng được. Khi đó, quay lại
đỉnh gần nhất trong đường đi hiện tại có các cạnh chưa đi qua
và lặp lại quy trình cho đến khi đã đi qua tất cả các cạnh của đồ
thị.

 Độ phức tạp thời gian của việc thực hiện ở trên là O (E)

9|Trang
Chu trình Euler của đồ thị

 Sau đây là đoạn mã java thực hiện thuật toán trên.

 Ví dụ minh họa cho thuật toán Hierholzer


Xét đồ thị có hướng sau:

10 | T r a n g
Chu trình Euler của đồ thị

 Sau khi quay về 1, đi qua các cạnh chưa sử dụng 1  3, 3  4, 4  1


 Lúc này current_path = {0, 1, 3, 4, 1} và circuit = {0, 2}
 Vì tất cả các cạnh đã được sử dụng nên pop từng phần tử của
current_path và push vào circuit
circuit = {0, 2, 1, 4, 3, 1, 0}
 In ngược lại circuit ta được chu trình Euler:
0 1  3  4  1  2  0

b. Thuật toán Fleury

 Đối với đồ thị vô hướng liên thông, mọi đỉnh đều có bậc chẵn
Xuất phát từ một đỉnh, chọn một cạnh liên thuộc với nó để đi tiếp
theo hai nguyên tắc sau:
 Xóa bỏ cạnh đã đi qua
 Chỉ đi qua cầu khi không còn cạnh nào khác để chọn

Tiếp tục chọn như vậy cho tới khi không đi tiếp được nữa, đường đi
tìm được là chu trình Euler.

 Đối với đồ thị có hướng liên thông yếu, mọi đỉnh đều có bán bậc
ra bằng bán bậc vào
Bằng cách "lạm dụng thuật ngữ", ta có thể mô tả được thuật toán tìm
chu trình Euler cho cả đồ thị có hướng cũng như vô hướng:
 Thứ nhất, dưới đây nếu ta nói cạnh (u, v) thì hiểu là cạnh nối đỉnh
u và đỉnh v trên đồ thị vô hướng, hiểu là cung nối từ đỉnh u tới đỉnh
v trên đồ thị có hướng.
 Thứ hai, ta gọi cạnh (u, v) là "một đi không trở lại" nếu như từ u ta
đi tới v theo cạnh đó, sau đó xoá cạnh đó đi thì không có cách nào
từ v quay lại u.

11 | T r a n g
Chu trình Euler của đồ thị

Vậy thì thuật toán Fleury tìm chu trình Euler có thể mô tả như sau: Xuất
phát từ một đỉnh, ta đi một cách tuỳ ý theo các cạnh tuân theo hai
nguyên tắc: Xoá bỏ cạnh vừa đi qua và chỉ chọn cạnh "một đi không trở
lại" nếu như không còn cạnh nào khác để chọn.

 Ví dụ minh họa cho thuật toán Fleury

12 | T r a n g
Chu trình Euler của đồ thị

13 | T r a n g
Chu trình Euler của đồ thị

4. Một số ứng dụng

 Bài toán người đưa thư Trung Hoa


 Bài toán về những quân Domino
 Bài toán tìm đường đi tối ưu cho xe rửa đường sao cho lượng
nước xả ra là ít nhất

14 | T r a n g

You might also like