Bài giảng Cấu trúc dữ liệu và thuật toán - Chương 7: Đồ thị và các thuật toán đồ thị - Nguyễn Đức Nghĩa

CHƯƠNG 7  
Đồ thị và các thuật toán đồ thị  
HCM  
HAN  
HP  
DAN  
NỘI DUNG  
1. Đồ thị  
Đồ thị vô hướng, Đồ thị có hướng,Tính liên thông của đồ thị  
2. Biểu diễn đồ thị  
Biểu diễn đồ thị bởi ma trận, Danh sách kề, Danh sách cạnh  
3. Các thuật toán duyệt đồ thị  
Thuật toán tìm kiếm theo chiều sâu, Thuật toán tìm kiếm theo chiều rộng  
4. Một số ứng dụng của tìm kiếm trên đồ thị  
Bài toán đường đi, Bài toán liên thông,  
Đồ thị không chứa chu trình và bài toán sắp xếp tôpô, Bài toán tô màu đỉnh đồ thị  
5. Bài toán cây khung nhỏ nhất  
Thuật toán Kruscal, Cấu trúc dữ liệu biểu diễn phân hoạch,  
6. Bài toán đường đi ngắn nhất  
Thuật toán Dijkstra, Cài đặt thuật toán với các cấu trúc dữ liệu  
2
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
1. Đồ thị  
Đồ thị là cặp (V, E), trong đó  
V là tập đỉnh  
E là họ các cặp đỉnh gọi là các cạnh  
Ví dụ:  
Các đỉnh là các sân bay  
Các cạnh thể hiện đường bay nối hai sân bay  
Các số trên cạnh có thể là chi phí (thời gian, khoảng cách)  
DBP  
DAN  
HAP  
HCM  
HAN  
BKK  
NHT  
VIN  
3
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Các kiểu cạnh  
Cạnh có hướng (Directed edge)  
flight  
VN 426  
Cặp có thứ tự gồm hai đỉnh (u,v)  
Đỉnh u là đỉnh đầu  
HAN  
HAN  
HCM  
HCM  
Đỉnh v là đỉnh cuối  
Ví dụ, chuyến bay  
1135  
km  
Cạnh vô hướng (Undirected edge)  
Cặp không có thứ tự gồm 2 đỉnh (u,v)  
Ví dụ, tuyến bay  
Đồ thị có hướng (digraph)  
Các cạnh có hướng  
Ví dụ, mạng truyền tin  
Đồ thị vô hướng (Undirected graph/graph)  
Các cạnh không có hướng  
Ví dụ, mạng tuyến bay  
4
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Ứng dụng  
Phò ng má y 1 Phò ng má y 2  
Mạch lôgic (Electronic circuits)  
Mạch in  
Phò ng hành chí nh  
Mạch tích hợp  
Mạng giao thông (Transportation  
networks)  
Mạng xa lộ  
Phòng Giáo vụ  
Mạng tuyến bay  
Mạng máy tính (Computer  
networks)  
Mạng cục bộ  
Trường ĐHQG  
Ban Giám đốc  
Phòng Tuyên huấn  
Internet  
Web  
Cơ sở dữ liệu (Databases)  
Tổ Tin  
Sơ đồ quan hệ thực thể  
Bờm  
(Entity-relationship diagram)  
Cuội  
Chị Hằng  
5
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Thuật ngữ  
Đầu mút của cạnh  
U và V là các đầu mút của cạnh a  
V
Cạnh kề với đỉnh  
a
c
b
e
a, d, và b kề với đỉnh V  
Đỉnh kề  
U và V là kề nhau  
Bậc của đỉnh  
X có bậc 5  
h
i
j
U
d
X
Z
W
g
Y
Cạnh lặp  
h và i là các cạnh lặp  
f
Khuyên  
j là khuyên  
Đơn đồ thị: Không chứa cạnh lặp và khuyên  
6
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Thuật ngữ (tiếp tục)  
Đường đi  
Dãy các đỉnh (hoặc dãy các cạnh), trong đó hai đỉnh  
liên tiếp là có cạnh nối:  
P: s = v0, v1, ..., vk-1, vk = t,  
(vi-1, vi) là cạnh của đồ thị, i=1, 2, ..., k.  
Độ dài của đường đi là số cạnh trên đường đi (k).  
s - đỉnh đầu và t - đỉnh cuối của đường đi P  
Đường đi đơn  
Các đỉnh trên đường đi là phân biệt  
7
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Thuật ngữ (tiếp tục)  
V
b
a
c
P1  
X
d
P2  
U
Z
h
e
W
g
Y
f
Ví dụ  
P1= V,X,Z (dãy cạnh: b, h) là đường đi đơn  
P2= U,W,X,Y,W,V) (P2=c,e,g,f,d) là đường đi nhưng  
không là đơn  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
8
Thuật ngữ (tiếp)  
Chu trì nh  
Đường đi gồm các cạnh  
phân biệt có đỉnh đầu trùng  
đỉnh cuối  
V
a
c
b
Chu trình đơn  
Ngoại trừ đầu trùng cuối,  
không còn hai đỉnh nào  
giống nhau  
d
C2  
U
X
Y
Z
h
C1  
e
Ví dụ  
W
g
C1= V,X,Y,W,U là CT đơn  
C2=U,W,X,Y,W,V là chu trinh  
f
không là đơn  
9
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Tính chất  
Tính chất 1  
Ký hiệu  
n
m
số đỉnh  
số cạnh  
Sv deg(v) = 2m  
CM: mỗi cạnh được đếm 2 lần  
Tính chất 2  
deg(v) bậc của đỉnh v  
Trong đơn đồ thị vô hướng (đồ  
thị không có cạnh lặp và  
khuyên)  
m n (n - 1)/2  
CM: mỗi đỉnh có bậc không  
quá (n - 1)  
Ví dụ  
n = 4  
m = 6  
deg(v) = 3  
Tương tự có những cận cho  
đồ thị có hướng  
10  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Graph ADT  
Các phép toán cơ bản (Basic Graph operations)  
khởi tạo/create (số đỉnh, isDirected)  
huỷ/destroy  
nhận số cạnh / get number of edges  
nhận số đỉnh / get number of vertices  
cho biết đồ thị là có hướng hay vô hướng / tell whether graph  
is directed or undirected  
bổ sung cạnh / insert an edge  
loại bỏ cạnh / remove an edge  
có cạnh nối giữa hai đỉnh / tell whether an edge exists between  
two vertices  
duyệt các đỉnh kề của một đỉnh cho trước / An iterator that  
Nguyễn ĐứcpNrgohĩcae-sBsộ amlôlnvKeHrMtTicĐeHsBKaHdNjacent to a given vertex  
11  
Các bài toán xử lý đồ thị  
Tính giá trị của một số đặc trưng số của đồ thị (số liên thông,  
sắc số, ...)  
Tìm một số tập con cạnh đặc biệt (chẳng hạn, cặp ghép, bè,  
chu trình, cây khung, ...)  
Tìm một số tập con đỉnh đặc biệt (chẳng hạn, phủ đỉnh, phủ  
cạnh, tập độc lập,...)  
Trả lời truy vấn về một số tính chất của đồ thị (liên thông,  
phẳng, ...)  
Các bài toán tối ưu trên đồ thị: Cây khung nhỏ nhất, đường  
đi ngắn nhất, luồng cực đại trong mạng, ...  
...  
12  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
2 Biểu diễn đồ thị  
13  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
2. Biểu diễn đồ thị  
Có nhiều cách biểu diễn,  
Việc lựa chọn cách biểu diễn phụ thuộc vào từng bài toán cụ  
thể cần xét, từng thuật toán cụ thể cần cài đặt.  
Có hai vấn đề chính cần quan tâm khi lựa chọn cách biểu  
diễn:  
Bộ nhớ mà cách biểu diễn đó đòi hỏi  
Thời gian cần thiết để trả lời các truy vấn thường xuyên  
đối với đồ thị trong quá trình xử lý đồ thị:  
Chẳng hạn:  
Có cạnh nối hai đỉnh u, v ?  
Liệt kê các đỉnh kề của đỉnh v ?  
14  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Ma trận kề (Adjacency Matrix)  
n n ma trận A.  
Các đỉnh được đánh số từ 1 đến |V| theo 1  
thứ tự nào đó.  
1 nÕu (i, j)E  
A[i, j] = a =  
A xác định bởi:  
ij  
0 nÕu tr¸i l¹i  
1
3
2
1
2
1 2 3 4  
1 0 1 1 1  
2 0 0 1 0  
3 0 0 0 1  
4 0 0 0 0  
1 2 3 4  
1 0 1 1 1  
2 1 0 1 0  
3 1 1 0 1  
4 1 0 1 0  
a
c
b
a
c
b
d
d
4
3
4
A = AT đối với đồ thị vô hướng.  
15  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Ma trận kề  
Chú ý về sử dụng ma trận kề:  
Dòng toàn không ~đỉnh cô lập.  
M[i, i] = 1 khuyên (self-loop)  
Bộ nhớ (Space)  
|V |2 bits  
Các thông tin bổ sung, chẳng hạn chi phí trên cạnh, cần được cất  
giữ dưới dạng ma trận.  
Thời gian trả lời các truy vấn  
Hai đỉnh i và j có kề nhau? O(1)  
Bổ sung hoặc loại bỏ cạnh  
O(1)  
Bổ sung đỉnh:  
tăng kích thước ma trận  
Liệt kê các đỉnh kề của v :  
O(|V|) (ngay cả khi v là đỉnh cô lập).  
16  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Ma trận trọng số  
Trong trường hợp đồ thị có trọng số trên cạnh, thay vì ma  
trận kề, để biểu diễn đồ thị ta sử dụng ma trận trọng số  
C = c[i, j], i, j = 1, 2,..., n,  
víi  
c(i, j), nÕu (i, j)E  
c[i, j] =  
,  
nÕu (i, j)E,  
trong ®ã lµ gi¸ trÞ ®Æc biÖt ®Ó chØ ra mét cÆp (i,j) kh«ng lµ  
c¹nh, tuú tõng tr-êng hîp cô thÓ, cã thÓ ®-îc ®Æt b»ng mét  
trong c¸c gi¸ trÞ sau: 0, +, -.  
17  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Ma trận trọng số  
Ví dụ  
5 3 6  
1
3
8
5
6
  8    
2
A = 6     
5
8
6
  2 7  
7
3
8      
2
4
18  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Danh sách kề (Adjacency List)  
Danh sá ch kề: Với mỗi đỉnh v cất giữ danh  
sá ch cá c đỉnh kề của nó .  
Là mảng Adj gồm |V| danh sá ch.  
Mỗi đỉnh có một danh sách.  
Với mỗi u V, Adj[u] bao gồm tất cả các đỉnh kề của u.  
Ví dụ  
Đồ thị vô hướng  
Đồ thị có hướng  
v
u
u
z
w
w
v
u
v
w
x
y
z
b
e
b
c
a
b
c
d
e
f
y
v
x
b
f
t
19  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Biểu diễn đồ thị bởi danh sách kề  
Yêu cầu bộ nhớ:  
Đối với đồ thị có hướng:  
Tổng số phần tử trong tất cả các danh sách kề là  
out-degree(v) = |E | (out-degree(v) – số cung đi ra khỏi v)  
vV  
Tổng cộng bộ nhớ: (|V |+|E |)  
Đối với đồ thị vô hướng:  
Tổng số phần tử trong tất cả các danh sách kề là  
degree(v) = 2|E |  
(degree(v) – số cạnh kề với v)  
vV  
Tổng cộng bộ nhớ: (|V |+|E |)  
20  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Biểu diễn đồ thị bởi danh sách kề  
Bộ nhớ (Space):  
O(|V| + |E|)  
Thường là nhỏ hơn nhiều so với |V|2, nhất là đối với đồ thị thưa  
(sparse graph) – là đồ thị mà |E| = k |V| với k < 10.  
Thời gian trả lời các truy vấn:  
Thêm cạnh  
Xoá cạnh  
Thêm đỉnh  
O(1)  
Duyệt qua danh sách kề của mỗi đầu mút.  
Phụ thuộc vào cài đặt.  
Liệt kê các đỉnh kề của v: O(<số đỉnh kề>) (tốt hơn ma trận kề)  
Tìm kiếm trên danh sách:  
Hai đỉnh i, j có kề nhau?  
(degree(u)). Đánh giá trong tình huống tồi nhất là O(|V |) => khô ng  
hiệu quả (tồi hơn ma trận kề)  
21  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Danh sách cạnh (Edge List)  
Với mỗi cạnh e = (u, v) cất giữ  
dau[e]= u , cuoi[e] = v  
Nếu đồ thị có trọng số trên cạnh, thì cần có  
thêm một biến cất giữ c[e]  
Đây là cách chuẩn bị dữ liệu cho các đồ thị  
thực tế  
22  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Danh sách cạnh  
e
1
2
3
4
5
6
7
8
dau[e] cuoi[e]  
c[e]  
6
1
1
5
4
1
1
4
2
3
5
1
5
4
2
3
3
2
8
5
8
6
2
7
3
5
8
3
6
7
5
3
2
2
4
8
6
23  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Đánh giá thời gian thực hiện các thao tác  
n đỉnh, m cạnh  
đơn đồ thị vô hướng  
Edge  
List  
Adjacency  
List  
Adjacency  
Matrix  
n + m  
n + m  
deg(v)  
n2  
n
Bộ nhớ  
incidentEdges(v)  
areAdjacent (v, w)  
insertVertex(o)  
insertEdge(v, w, o)  
removeVertex(v)  
removeEdge(e)  
m
m min(deg(v), deg(w))  
1
n2  
1
1
1
1
deg(v)  
1
1
m
1
n2  
1
24  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
3. Các thuật toán duyệt đồ thị  
Graph Searching  
25  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Duyệt đồ thị  
Ta gọi duyệt đồ thị (Graph Searching hoặc Graph Traversal)  
là việc duyệt qua mỗi đỉnh và mỗi cạnh của đồ thị.  
Ứng dụng:  
Xây dựng các thuật toán khảo sát các tính chất của đồ thị;  
Là thành phần cơ bản của nhiều thuật toán.  
Cần xây dựng thuật toán hiệu quả để thực hiện việc duyệt đồ  
thị. Ta xét hai thuật toán duyệt cơ bản:  
Tìm kiếm theo chiều rộng (Breadth First Search – BFS)  
Tìm kiếm theo chiều sâu (Depth First Search – DFS)  
26  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Ý tưởng chung  
Trong quá trình thực hiện thuật toán, mỗi đỉnh ở một trong  
ba trạng thái:  
Chưa thăm (thể hiện bởi màu trắng),  
Đã thăm nhưng chưa duyệt xong (thể hiện bởi màu xám)  
Đã duyệt xong (thể hiện bởi màu đen).  
Quá trình duyệt được bắt đầu từ một đỉnh v nào đó. Ta sẽ  
khảo sát các đỉnh đạt tới được từ v:  
Thoạt đầu mỗi đỉnh đều có màu trắng (chưa thăm - not visited).  
Đỉnh đã được thăm sẽ chuyển thành màu xám (trở thành đã thăm  
nhưng chưa duyệt xong).  
Khi tất cả các đỉnh kề của một đỉnh v là đã được thăm, đỉnh v sẽ có  
màu đen (đã duyệt xong).  
27  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Thuật toán tìm kiếm theo chiều rộng  
(BFS algorithm)  
28  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
BFS  
Input: Đồ thị G = (V, E), có hướng hoặc vô hướng, và đỉnh xuất phát sV.  
Output:  
Với mọi v V  
d[v] = khoảng cách từ s đến v.  
[v] – đỉnh đi trước v trong đường đi ngắn nhất từ s đến v.  
Xây dựng cây BFS gốc tại s chứa tất cả các đỉnh đạt đến được từ s.  
Ta sẽ sử dụng màu để ghi nhận trạng thái của đỉnh trong quá trình duyệt:  
Trắng (White) – chưa thăm.  
Xám (Gray) – đã thăm nhưng chưa duyệt xong.  
Đen (Black) – đã duyệt xong  
29  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Tìm kiếm theo chiều rộng từ đỉnh s  
BFS_Visit(s)  
10 while Q    
11 do u dequeue(Q)  
1. for u V – {s}  
2
3
4
do color[u] white  
d[u]    
12  
13  
14  
15  
16  
17  
18  
for v Adj[u]  
do if color[v] = white  
then color[v] gray  
d[v] d[u] + 1  
[v] u  
[u] NULL  
5 color[s] gray  
6 d[s] 0  
enqueue(Q,v)  
7 [s] NULL  
8 Q    
color[u] black  
9 enqueue(Q,s)  
30  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Thuật toán tìm kiếm theo chiều rộng trên đồ thị G  
BFS(G)  
1. for u V  
2.  
3.  
do color[u] white  
[u] NULL  
5. for u V  
6.  
7.  
do if color[u] = white  
then BFS-Visit(u)  
31  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Ví dụ: Thực hiện BFS(A)  
A
B
J
F
I
C
H
E
D
32  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Q = {A}  
A
B
J
F
I
C
H
E
D
33  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Q = {B,F}  
A
B
J
F
I
C
H
E
D
34  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Q = {F,C,J}  
A
B
J
F
I
C
H
E
D
35  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Q = {C,J,E,I}  
A
B
F
J
I
C
H
E
D
36  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Q = {J,E,I,H}  
A
B
J
F
I
C
H
E
D
37  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Q = {E,I,H}  
A
B
J
F
I
C
H
E
D
38  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Q = {I,H}  
A
B
J
F
I
C
H
E
D
39  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Q = {H}  
A
B
J
F
I
C
H
E
D
40  
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN  
Tải về để xem bản đầy đủ
pdf 70 trang Thùy Anh 19680 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc dữ liệu và thuật toán - Chương 7: Đồ thị và các thuật toán đồ thị - Nguyễn Đức Nghĩa", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_cau_truc_du_lieu_va_thuat_toan_chuong_7_do_thi_va.pdf