TIẾP NỐI CHƯƠNG 2 CỦA SLISE MÔN TOÁN RỜI RẠC MÌNH XIN GỬI ĐẾN CÁC BẠN CHƯƠNG 3 MÌNH MONG RẰNG VỚI NHỮNG MẪU SLIDE NÀY SẼ GIÚP MỌI NGƯỜI DỄ DÀNG HƠN KHI HỌC TẬP VÀ THỰC HÀNH MÔN NÀY ..... ,,,,,,
Trang 1CHƯƠNG 3: LÝ THUYẾT ĐỒ THỊ
GV: Đặng Hữu Nghị Sđt: 0989640319
Email: nghidanghuu@gmail.com
Trang 2NỘI DUNG
3.1 •Các khái niệm cơ bản của lý thuyết đồ thị
3.2 •Biểu diễn đồ thị trên máy tính
3.3 •Các thuật toán tìm kiếm trên đồ thị
3.4 •Đồ thị Euler và đồ thị Hamilton
3.5 •Cây và cây khung của đồ thị
Trang 33.5.1 CÂY VÀ CÁC TÍNH CHẤT CƠ BẢN CỦA
Trang 43.5.1 CÂY VÀ CÁC TÍNH CHẤT CƠ BẢN CỦA
3) T không chứa chu trình và có n−1 cạnh
4) T liên thông và mỗi cạnh là cầu
5) Giữa hai đỉnh phân biệt bất kỳ của T luôn có duy nhất
một đường đi đơn
Trang 5BÀI TẬP
1 Đồ thị nào trong các đồ thị sau là cây
5
Trang 63.5.2 CÂY KHUNG CỦA ĐỒ THỊ
Trong đồ thị liên thông G,
nếu ta loại bỏ cạnh nằm trên chu trình nào đó thì ta sẽ được
đồ thị vẫn là liên thông.
Nếu cứ loại bỏ các cạnh ở các chu trình khác cho đến khi nào
đồ thị không còn chu trình (vẫn liên thông) thì ta thu được
một cây nối các đỉnh của G.
Cây đó gọi là cây khung hay cây bao trùm của đồ thị G
Định nghĩa: Giả sử G = (V ,E ) là đồ thị vô hướng
liên thông Cây T= (V ,F) với F E được gọi là cây
khung của đồ thị G
Trang 73.5.2 CÂY KHUNG CỦA ĐỒ THỊ
Đồ thị và các cây khung của nó
7
Trang 83.5.2 CÂY KHUNG CỦA ĐỒ THỊ
Định lý sau đây cho biết số lượng cây khung của đồ thị
đầv đủ Kn
Định lý 2 (Cayley): Số cây khung của đổ thị K n là n n-2
Định lý 2 cho thấy số lượng cây khung của một đổ thị là
một số rất lớn
Trang 9BÀI TẬP
Hãy vẽ tất cả các cây khung của các đồ thị sau:
9
Trang 10BÀI TẬP
3 Đồ thị sau có bao nhiêu cây khung, liết kê các cây khung
đó
Trang 113.5.2 CÂY KHUNG CỦA ĐỒ THỊ
Ta xét áp dựng của thuật toán tìm kiếm theo chiều sâu và
theo chiều rộng trên đồ thị để xây dựng cây khung của
đổ thị vô hướng liên thông
Trong cả hai trường hợp mỗi khi ta đến được đỉnh mới u
(tức Chuaxet[u] = true) từ đỉnh v thì cạnh (v, u) sẽ được
kết nạp vào cây khung
11
Trang 123.5.2 CÂY KHUNG CỦA ĐỒ THỊ
procedure STREE_DFS(v);
(* Tìm kiếm theo chi ều sâu áp dụng vào tìm tập cạnh của cáy khung T của đồ
thị vô hướng liên thông G cho bởi danh sách kề Các biến Chuaxet, Ke, T là
toàn cục *)
begin
Chuaxet[v] := false ;for u ϵ Ke(v) do
if Chuaxet[u] thenbegin
T := T (v, u) ;STREE_DFS(u);
Trang 133.5.2 CÂY KHUNG CỦA ĐỒ THỊ
(* Main Program *)
BEGIN
(* Initialiation *)for u ϵ V do Chuaxet[u]:=true;
T := ; (* T là tập cạnh của cây khung *) STREE_DFS(root); (* root là đỉnh nào đó của đồ thị *)
END
13
Trang 153.5.2 CÂY KHUNG CỦA ĐỒ THỊ
10
13
Trang 163.5.2 CÂY KHUNG CỦA ĐỒ THỊ
procedue STREE_BFS(r);
(* Tìm kiếm theo chiều rộng áp dụng tìm tập cạnh của cây khung T
của đồ thị vô hướng liên thông G cho bởi danh sách Ke *)
begin
QUEUE := ;
QUEUE r ; Chuaxet[r]:=false;
While QUEUE ≠ do begin
v QUEUE;
for u ϵ Ke(v) do
if Chuaxet[u] then begin
QUEUE u; Chuaxet[u]:=false;
Trang 173.5.2 CÂY KHUNG CỦA ĐỒ THỊ
Trang 183.5.2 CÂY KHUNG CỦA ĐỒ THỊ
VD: Tìm cây khung của đồ thị :
2
8
Trang 19Bước T.thái Queue:
Trang 213.5.3 XÂY DỰNG TẬP CÁC CHU TRÌNH CƠ BẢN
CỦA ĐỒ THỊ
Giả sử G = (V, E) là đơn đồ thị vô hướng liên thông,
H=(V, T) là cây khung của nó
Các cạnh của đồ thị thuộc cây khung ta sẽ gọi là các cạnh
trong, còn các cạnh còn lại sẽ gọi là cạnh ngoài
Định nghĩa 3: Nếu thêm một cạnh ngoài e ϵ E \ T vào
cây khung H chúng ta sẽ thu được đúng một chu trình
trong H, ký hiệu chu trình này là Ce Tập các chu trình
Ω = {Ce: e ϵ E \ T } được gọi là tập các chu trình cơ
bản của đồ thị G
21
Trang 223.5.3 XÂY DỰNG TẬP CÁC CHU TRÌNH CƠ BẢN
Tên gọi chu trình cơ bản gắn liền với sự kiện là mỗi chu
trình của đồ thị đều có thể thu được từ các chu trình cơ
bản như chỉ ra trong định lý sau đây:
Định lý 3: Giả sử G = (V, E) là đồ thị vô hướng liên
Trang 233.5.3 XÂY DỰNG TẬP CÁC CHU TRÌNH CƠ BẢN
CỦA ĐỒ THỊ
Việc tìm tập các chu trình cơ bản giữ một vai trò quan
trọng trong vấn đề giải tích mạng điện Cụ thể hơn, theo
mỗi chu trình cơ bản của đồ thị tương ứng với mạng điện
cần phân tích ta sẽ thiết lập được một phương trình tuyến
tính theo định luật Kirchoff:
Tổng hiệu điện thế dọc theo một mạch vòng là bằng
không Hệ thống phương trình tuyến tính thu được cho
phép tính toán hiệu điện thế trên mọi đoạn đường dây
của lưới điện
23
Trang 243.5.3 XÂY DỰNG TẬP CÁC CHU TRÌNH CƠ BẢN
CỦA ĐỒ THỊ
Mô tả thuật toán xây dựng tập các chu trình cơ bản dựa
trên thủ tục tìm kiếm theo chiều sâu trên đồ thị
Thuật toán có cấu trúc tương tự như thuật toán xây dựng
cây khung theo thủ tục tìm kiếm theo chiều sâu mô tả
trong mục trước
Thuật toán xây dựng tập các chu trình cơ bản Giả thiết
rằng đồ thị G = (V, E) được mô tả bằng danh sách kề
Ke(v), v ϵ V
Trang 253.5.3 XÂY DỰNG TẬP CÁC CHU TRÌNH CƠ BẢN
if (u ≠STACK[d-l]) and (Index[v] > Index[u]) then
< Ghi nhận chu trình với các đỉnh:
STACK[d], STACK[d-1], , STACK[c] , với STACK[c]=u >:
d := d - l;
end;
25
Trang 263.5.3 XÂY DỰNG TẬP CÁC CHU TRÌNH CƠ BẢN
Trang 323.5.4 BÀI TOÁN CÂY KHUNG NHỎ NHẤT
Cho G = (V, E) là đồ thị vô hướng liên thông với tập đỉnh V =
{1, 2, , n} và tập cạnh E gồm m cạnh.
Mỗi cạnh e của đồ thị G được gán với một số thực c(e), gọi là
độ dài của nó.
Giả sử H = (V, T) là cây khung của đồ thị G Ta gọi độ dài
c(H) của cây khung H là tổng độ dài của các cạnh của nó:
Trang 333.5.4 BÀI TOÁN CÂY KHUNG NHỎ NHẤT
Ví dụ về đồ thị có trọng số trên cạnh và cây khung nhỏ
nhất của đồ thị được chỉ ra bởi các cạnh tô đậm
33
Trang 343.5.4 BÀI TOÁN CÂY KHUNG NHỎ NHẤT
Bài toán xây dựng hệ thống đường sắt:
Giả sử ta muốn xây dựng một hệ thống đường sắt nối n thành
phố sao cho hành khách có thể đi từ bất cứ một thành phố nào
đến bất kỳ một trong số các thành phố còn lại.
Và chi phí vể xây dựng hệ thống đường phải là nhỏ nhất
Rõ ràng là đổ thị mà đỉnh là các thành phố còn các cạnh
là các tuyến đường sắt nối các thành phố tương ứng với
phương án xây dựng tối ưu phải là cây
Vì vậy, bài toán đặt ra dẫn về bài toán tìm cây khung
Trang 353.5.4 BÀI TOÁN CÂY KHUNG NHỎ NHẤT
Bài toán nối mạng máy tính.
Cần nối mạng một hệ thống gồm n máy vi tính đánh số từ 1
đến n.
Biết chi phí nối máy i với máy j là c[i, j], i , j = 1, 2,, , n
(thông thường chi phí này phụ thuộc vào độ dài cáp nối cần
sử dụng).
Hãy tìm cách nối mạng sao cho tổng chi phí nối mạng là nhỏ
nhất
35
Trang 363.5.4.1 THUẬT TOÁN KRUSKAL
nhất T=(VT, ET) theo từng bước:
1. Bắt đầu từ đồ thị rỗng T có n đỉnh
trọng số
cạnh của dãy đã được xếp vào T theo nguyên tắc cạnh
thêm vào không được tạo thành chu trình trong T
Lặp lại Bước 3 cho đến khi nào số cạnh trong T bằng
Trang 373.5.4.1 THUẬT TOÁN KRUSKAL
procedure Kruskal;
begin
T : = 0 ;while (|T| < n-1) and ( E ≠ ) dobegin
Trang 383.5.4.1 THUẬT TOÁN KRUSKAL
Ví dụ : Tim cây khung nhỏ nhất của đồ thị cho trong
hình
Trang 393.5.4.1 THUẬT TOÁN KRUSKAL
Bước khởi tạo Đặt T := S ắp xếp các cạnh của đồ thị theo
thứ tự không giảm của độ dài ta có dãy:
Tinh huống tương tự cũng xảy ra đối với cạnh (3,4) là cạnh
tiếp theo trong dãy.
Tiếp theo ta bổ sung cạnh (1,3), (2,3) vào T và thu được tập T
gồm 5 cạnh;
T = {(3,5), (4,6), (4,5), (1,3), (2,3)}
chính là tập cạnh của cây khung nhỏ nhất cần tìm. 39
Trang 403.5.4.1 THUẬT TOÁN KRUSKAL
Ví dụ : Tim cây khung nhỏ nhất của đồ thị cho trong
2
2
5 5
Trang 413.5.4.2 THUẬT TOÁN PRIM
Thuật toán Kruskal làm việc kém hiệu quả đối với những
đồ thị dày (đồ thị với số cạnh m n(n-1)/2).
Trong trường hợp đó thuật toán Prim tỏ ra hiệu quả hơn
gần nhất
41
Trang 423.5.4.2 THUẬT TOÁN PRIM
Trong phương pháp này, bắt đầu từ một đỉnh tuỳ ý của
đồ thị s, đầu tiên ta nối s với đỉnh lân cận gần nó nhất,
Trang 433.5.4.2 THUẬT TOÁN PRIM
Đồ thị cho bởi ma trận trọng số C = c[i, j], i, j = 1, 2, , n
các đỉnh của đổ thị sẽ được gán cho các nhãn Nhãn của một
đỉnh v sẽ gồm hai phần và có dạng [d[v], near[v]]
d[v] := min { c[v, w] : w ϵ V H}
Near[v] ghi nhận đỉnh của cây khung gần v nhất (near[v] := z).
43
Trang 44H = ( VH ,T) là cây khung nhỏ nhất của đồ thị ;
Stop := true;
end else for v ϵ V\ VH do
if d[v]> c[u,v] then
Trang 453.5.4.2 THUẬT TOÁN PRIM
Tim cây khung nhỏ nhất cho đồ thị xét trong thí dụ sau
theo thuật toán Prim
45
Trang 463.5.4.2 THUẬT TOÁN PRIM
Ma trận trọng số của đồ thị có dạng
Trang 473.5.4.2 THUẬT TOÁN PRIM
Bảng dưới đây ghi nhãn của các đỉnh trong các bước lặp
của thuật toán, đỉnh đánh dấu * là đỉnh được chọn để bổ
sung vào cây khung (khi đó nhãn của nó không còn bị
biến đổi trong các bước lặp tiếp theo, vì vậy ta đánh dấu
- để ghi nhận điếu đó):
47
Trang 493.5.4.2 THUẬT TOÁN PRIM
của đồ thị Các cạnh đậm là các cạnh được chọn vào cây
khung
49
Trang 50BÀI TẬP
4 Cho đồ thị như hình vẽ bên, tìm cây khung nhỏ nhất
theo thuật toán Prim
Trang 513.5.5 CÂY CÓ GỐC
51
Trang 52 vn là con (child) của vn-1
Nếu x là tiền bối của y thì y là hậu
Trang 533.5.5.1 CÁC KHÁI NIỆM
Nếu x không có con thì x là lá
(leaf)
Nếu x không là lá thì x là đỉnh
trong (branch vertex)
Mức (level) của đỉnh x là chiều
dài (số cành) của đường đơn từ
Tập các cành gồm mọi cành nối tới
các hậu duệ của x
53
Trang 55 Cây có gốc thứ tự (Ordered rooted tree) nếu các con của
mỗi đỉnh trong được xếp thứ tự từ trái qua phải
55
Trang 563.5.5.1 CÁC KHÁI NIỆM
Đặc biệt: Cây nhị phân có thứ tự - Nếu một đỉnh trong
có đủ 2 con thì
Con thứ nhất là con bên trái (left child)
Con thứ hai là con bên phải ( right child)
(balanced) nếu tất cả các lá đều ở mức h hay h-1
Trang 57MỘT SỐ VÍ DỤ
Mô hình gia phả một dòng họ
57
Trang 58MỘT SỐ VÍ DỤ
Mô hình biểu diễn của các tổ chức
Ví dụ: Mô hình tổ chức Trường Đại Học
Trang 59MỘT SỐ VÍ DỤ
59
Trang 60MỘT SỐ VÍ DỤ
Trò đố 8 ô
Nguyên bản của trò chơi là trò đố 15 ô như hình
dưới, có 15 viên gạch đánh số khác nhau được đặt
vừa vào 16 ô vuông theo bảng
Có một ô vuông để trống nên các viên gạch đó có
thể di chuyển loanh quanh để tạo ra các sắp xếp
khác nhau
Mục tiêu là tìm ra một chuỗi bước di chuyển các
viên gạch vào ô trống để sắp xếp bảng thành một
cấu hình đích nào đó
Trang 61Trạng thái ban đầu Trạng thái đích
Trang 64MỘT SỐ VÍ DỤ
Trò chơi Tic-Tac-Toe
nhất có thể đặt ký hiệu nước đi X vào bất cứ ô nào
trong 9 ô trống của bàn cờ
cờ khác cho phép đấu thủ thứ hai đến lượt mình
đi sẽ có thể chọn 8 cách đặt ký hiệu nước đi O của
mình vào Và sẽ cứ luân phiên như thế
Trang 663.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
trong đó:
Mỗi đỉnh được gán cho một nhãn
Các nhãn có thể so sánh được với nhau
∀ đỉnh v ∈T, các nhãn trong cây con bên trái của v đều nhỏ
hơn nhãn của v và các nhãn trong cây con bên phải của v đều
lớn hơn nhãn của v
Trang 673.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
Ví dụ: 30, 20, 10, 40, 32, 27, 17, 8, 42, 78, 35
67
Trang 683.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
Thuật toán tìm kiếm trên cây tìm kiếm nhị phân
Giả sử ta có một cây tìm kiếm, x là một giá trị nào đó
Xác định vị trí của biến x nếu x là nhãn của một đỉnh v
Nếu thấy rằng x không là nhãn của một đỉnh nào cả thì
tạo ra một đỉnh mới và gán nhãn x cho đỉnh đó
Độ phức tạp thuật toán: O(logn)
Trang 693.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
Thuật toán tìm kiếm trên cây tìm kiếm nhịphân
Void TK (Cây NPTK T, phần tử x);
{
v = gốc của T;
if(v == NULL) thêm đỉnh r vào cây và gán cho nó nhãn là x
while((v != NULL) && (label(v) != x) )
{
if(x == label(v)) cout<< “Tìmđược x”;
if(x < label(v))
if(con bên trái v != NULL) v = con bên trái v;
else thêm đỉnh nhãn x là con bên trái v và đặt v := NULL;
if(x > label(v))
if(con bên phải v != NULL) v = con bên phải v;
else thêm đỉnh nhãn x là con bên phải v và đặt v:=NULL;
}
Trang 703.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
Biểu diễn cây nhị phân
Thông tin lưu tại nút:
Info
Ðịa chỉ nút gốc của cây
Trang 713.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
C ấu trúc dữ liệu của 1 nút
typedef struct tagTNode
{
int Key; //trường dữ liệu là 1 số nguyên
struct tagTNode *pLeft;
struct tagTNode *pRight;
} TNode;
C ấu trúc dữ liệu của cây
typedef TNode *TREE;
71
Trang 723.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
Tạo cây rỗng
void CreateTree(TREE &T)
{
}
Trang 733.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
Trang 743.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
if (T->Key > X) return insertNode(T->pLeft, X);
else return insertNode(T->pRight, X);
} T= new TNode;
if (T == NULL) return -1;
T->Key = X;
Trang 753.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
75
4 4
Trang 763.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
TNode * searchNode (TREE Root, int x)
{ TNode *p = Root;
while (p != NULL) { if (x == p->Key) return p;
else
if (x < p->Key) p = p->pLeft;
else p = p->pRight;
Trang 773.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
Trang 783.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
44
Hủy X=37
Trang 793.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
79
Trang 803.5.5.2 CÂY TÌM KIẾM NHỊ PHÂN
Trang 813.5.5.3 CÂY QUYẾT ĐỊNH
Thuật toán tìm kiếm trên cây tìm kiếm nhị phân
Cây quyết định là cây có gốc mà:
Mỗi đỉnh tương ứng với 1 quyết định
Mỗi cây con tại các đỉnh này ứng với mỗi kết cục có thể của
của quyết định
Một lời giải là một đường đi từ gốc đến lá
Ví dụ 1: Cho 8 đồng xu, trong đó có một đồng nhẹ hơn
Xác định nó bằng 1 cái cân thăng bằng
81
Trang 823.5.5.3 CÂY QUYẾT ĐỊNH
Có 3 trạng thái sau mỗi lần cân Do đó cây quyết định
cho một dãy các lần cân là cây tam phân
Có ít nhất 8 lá trong cây quyết định vì có 8 kết cục có thể
và mỗi kết cục cần biểu diễn bằng ít nhất 1 lá
Số lần cân nhiều nhất để xác định đồng xu giả là chiều
cao của cây h
Ta có h≥ ⎡log38⎤ = 2 (làm tròn tăng)
Trang 833.5.5.3 CÂY QUYẾT ĐỊNH
83
Trang 843.5.5.3 CÂY QUYẾT ĐỊNH
tennis” ứng với thời tiết nào đó không
Trang 853.5.5.3 CÂY QUYẾT ĐỊNH
85
Trang 863.5.5.3 CÂY QUYẾT ĐỊNH
Trang 873.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Thuật toán viếng thăm mọi đỉnh của một cây có gốc có
thứ tự đúng 1 lần một cách có hệ thống gọi là thuật toán
duyệt cây
™Có 3 thuật toán phổ thông:
Duyệt tiền tự (Preoder traversal)
Duyệt trung tự (Inorder traversal)
Duyệt hậu tự (Postorder traversal)
87
Trang 883.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Thuật toán duyệt tiền tự
Duyệt cho tới khi tất cả các nút
đều được duyệt:
Trang 893.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Thuật toán duyệt tiền tự
void Preorder( cây thứ tự có gốc T);
89
Trang 903.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Ví dụ
Trang 913.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Thuật toán duyệt trung tự
Duyệt cho tới khi tất cả các nút đều
Trang 923.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Thuật toán duyệt trung tự
s = con đầu tiên từ trái sang phải của r T(s) = Cây con với gốc s;
Inorder(T(s));
Thăm r;
for (Mỗi cây con c của r từ trái sang phải trừ s)
Trang 933.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Ví dụ
Duyệt trung tự: d, c, e, b, a, g, f, h, m, l, n, k, o, p, s, q, t 93
Trang 943.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Thuật toán duyệt hậu tự
Duyệt cho tới khi tất cả các nút
đều được duyệt:
Bước 1: Duyệt các cây con bên
trái một cách đệ qui
Bước 2: Duyệt các cây con bên
phải một cách đệ qui
Bước 3: Truy cập nút gốc.
Trang 953.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Thuật toán duyệt hậu tự
Void Postorder( cây thứ tự có gốc T);
{
r = gốc của T for (Mỗi cây con c của r từ trái sang phải) {
T(c) = Cây con với gốc c Postorder( T(c) )
} Thăm r
Trang 963.5.5.4 CÁC PHƯƠNG PHÁP DUYỆT CÂY
Ví dụ
Trang 97BÀI TẬP
97
Trang 98CÂY BIỂU THỨC
Trang 99CÂY BIỂU THỨC
Cây biểu diễn biểu thức (6 / 2 + 3) * (7 - 4) như sau:
99
Dạng tiền tố (prefix) của biểu thức: * + / 6 2 3 - 7 4
Dạng trung tố (infix) của một biểu thức: 6 / 2 + 3 * 7 – 4
Dạng hậu tố (postfix) của biểu thức: 6 2 / 3 + 7 4 - *