Professional Documents
Culture Documents
FinalPrj Gr2.29
FinalPrj Gr2.29
BÁO CÁO
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
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)
1|Trang
Chu trình Euler của đồ thị
Đồ 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.
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
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ị
Ma trận liền kề
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ị
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ị.
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.
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:
7|Trang
Chu trình Euler của đồ thị
8|Trang
Chu trình Euler của đồ thị
Thuật toán:
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ị
10 | T r a n g
Chu trình Euler của đồ thị
Đố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.
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ị
14 | T r a n g