Chương 7: Đồ thị và các thuật toán đồ thị - Cấu trúc dữ liệu và giải thuật (ET2100) | Trường Đại học Bách khoa Hà Nội

Đồ thị vô hướng, Đồ thị có hướng,Tính liên thông của đồ thị

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
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
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
2
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)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Các kiểu cnh
Cạnh có hướng (Directed edge)
Cặp có thứ tự gồm hai ỉnh (u,v) flight
HAN HCM
Đỉnh u là ỉnh ầu VN 426
Đỉnh v là ỉnh cuối Ví dụ, chuyến bay
Cạnh vô hướng (Undirected edge) 1135
HAN HCM
Cặp không có thứ tự gồm 2 ỉnh (u,v) km
Ví dụ, tuyến bay
Đồ thị có hướng (digraph)
Các cạnh có hướng
Ví dụ, mạng truyền tin
3
DAN
DBP
VIN
NHT
HAP
BKK
HAN
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Đồ thị vô hướng (Undirected graph/graph)
Các cạnh không có hưng
Ví dụ, mạng tuyến bay
4
ng dng
Mạch lôgic (Electronic circuits) Phòng máy 1 Phòng máy 2
Mạch in
Mạch tích hợp
Mạng giao thông
(Transportation networks)
Mạng xa lộ
Mạng tuyến bay
Mạng máy tính (Computer
networks)
Mạng cục bộ
Internet
Web
Cơ sở dữ liu (Databases)
Sơ ồ quan hệ thực
th
(Entity-relationship diagram)
Cuội
Chị Hằng
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
5
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Thuật ngữ
Thuật ngữ (tiếp tc)
Đườ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 = v
0
, v
1
, ..., v
k-1
, v
k
= t,
(v
i-1
, v
i
) là cạnh ca thị, i=1, 2, ..., k.
Độ dài của ường i là số cnh 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
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
7
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Thuật ngữ (tiếp tc)
Ví dụ
P
1
= V,X,Z (dãy cạnh: b, h) là ường i ơn
P
2
= U,W,X,Y,W,V) (P
2
=c,e,g,f,d) là ường i nhưng
không là ơn
8
P
1
X
U
V
W
Z
Y
a
c
b
e
d
f
g
h
P
2
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
Chu trình ơn
Ngoại trừ ầu trùng cuối,
không còn hai ỉnh nào
giống nhau Ví dụ
C
1
= V,X,Y,W,U là CT ơn
C
2
=U,W,X,Y,W,V là chu trinh
không là ơn
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
9
Tính chất
Tính chất 1
S
v
deg(v) = 2m
CM: mỗi cạnh ược ếm 2 lần
Tính chất 2
Trong ơn thhướ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)
Tương tự có những cận
cho ồ thị có hướng
Nguyễn Đức Nghĩa - Bộ môn KHMT
ĐHBKHN
Ký hiệu
n
số ỉnh
C
1
X
U
V
W
Z
Y
a
c
b
e
d
f
g
h
C
2
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
m
số cạnh
deg(v)
bậc của ỉnh v
Ví dụ
n = 4
m = 6
deg(v) = 3
10
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 Đức Nghĩa process all vertices adjacent to a given vertex- Bộ môn KHMT ĐHBKHN
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ố, ...)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
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
2 Biểu diễn th
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
13
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
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
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
Ma trận kề (Adjacency Matrix)
n n ma trận A.
Các ỉnh ược ánh số từ 1 ến |V| theo 1
2
1 2 3 4
12
1 2 3 4
1 0 1 1 11 0 1 1
1
2 0 0 1 02 1 0 1
0
3 0 0 0 13 1 1 0 1
34
4 0 0 0 0 34 4 1 0 1 0
A = A
T
ối với ồ thị vô hướng.
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 15
Ma trận k
Chú ý về sử dụng ma trận kề:
Dòng toàn không ~ ỉnh cô lập.
1
thtự nào ó.
A xác nh
bởi:
1
A i j[ , ] = =a
ij
0
nÕu ( , )i j E
nÕu tr¸i l¹i
a
d
c
b
a
d
c
b
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
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ữ
ới dạng ma trận.
Thời gian trả lời các truy vấn
Hai ỉnh i 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
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[ , ] = c i j(, nÕu (, ), nÕu (i, ji,
j)) EE,
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 p thÓ, thÓ®îc ®Æt b»ng mét trong c¸c gi¸
trÞsau: 0, + , .
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 17
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Ma trận trọng s
5 3 6
8
A=
6
2 7
8
18
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 tt cả các ỉnh kề của u.
Ví dụ
Đồ thị vô hướng
Đồ thị có hướng
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
19
v
u
u
z
v
x
w
w
v
y
u
v
w
x
y
z
t
b
e
b
b
f
c
a
b
c
d
e
f
1
2
5
4
3
5
8
6
8
6
7
2
3
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Biu din thị bởi danh sách k
Yêu cầu bộ nhớ:
Đối với thị có hướng:
Tổng số phn tử trong tất cả các danh sách kề
out-degree(v) = |E | (out-degree(v) – số cung i ra khỏi v) v V
Tổng cộng bộ nh: (|V |+|E |) Đối với thị vô
ng:
Tổng số phn tử trong tất cả các danh sách kề
degree(v) = 2|E | (degree(v) – số cạnh kề với v)
v V
Tổng cộng bộ nh: (|V |+|E |)
20
Biu din 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| vi k < 10. Thời gian trả
lời các truy vấn:
Thêm cạnh O(1)
Xoá cạnh Duyệt qua danh sách kề của mỗi ầu mút.
Thêm ỉnh 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ề)
Hai ỉnh i, j có kề nhau? Tìm kiếm trên danh sách:
(degree(u)). Đánh giá trong tình huống tồi nhất O(|V |) => không
hiệu quả (ti hơn ma trận kề)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
21
Danh sách cạnh (Edge List)
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
Danh sách cnh
e
dau[e]
cuoi[e]
c[e]
1
1
5
6
2
5
1
8
3
4
5
7
4
1
4
3
5
1
2
5
6
4
3
2
1
5
4
5
8
6
7
2
3
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
7
2
3
8
8
3
2
6
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
23
Đánh giá thời gian thực hiện các thao tác
n ỉnh, m cạnh
ơn ồ thị vô
ng
Edge
List
Adjacency
List
Adjacency
Matrix
Bộ nh
n + m
n + m
n2
incidentEdges(v)
m
deg(v)
n
areAdjacent (v, w)
m
min(deg(v), deg(w))
1
insertVertex(o)
1
1
n2
insertEdge(v, w, o)
1
1
1
removeVertex(v)
m
deg(v)
n2
removeEdge(e)
1
1
1
24
3. Các thuật toán duyệt th
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Graph Searching
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
25
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ị.
Ứngdụ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 rng (Breadth First Search – BFS)
Tìm kiếm theo chiều sâu (Depth First Search – DFS)
26
Ý 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:
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
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ề ca một ỉnh v là ã ược thăm, ỉnh v sẽ có màu en ( ã
duyệt xong).
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
27
Thuật toán tìm kiếm theo chiu rng
(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 s V.
Output:
Với mọi v V
d[v] = khoảng cách ts ế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
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
29
Tìm kiếm theo chiều
rộng từ ỉnh s
BFS_Visit(s)
1. for u V – {s}
2 do color[u]
white
3 d[u]
4 [u] NULL
5 color[s] gray
6 d[s] 0
7 [s] NULL
8 Q
9 enqueue(Q,s)
10 while Q
11 do u dequeue(Q)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
12 for v Adj[u]
13 do if color[v] =
white
14 then color[v]
gray 15 d[v]
d[u] + 1
16 [v] u
17 enqueue(Q,v)
18 color[u] black
30
Thuật toán tìm kiếm theo chiu rộng trên ồ thG
BFS(G)
1. for u V
2. do color[u] white
3. [u] NULL
5. for u V
6. do if color[u] = white
7. then BFS-Visit(u)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
31
Ví dụ: Thực hiện
BFS(A)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
32
Q = {A}
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
33
I
J
H
C
F
A
B
E
D
I
J
H
C
F
A
B
E
D
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Q = {B,F}
34
I
J
H
C
F
A
B
E
D
| 1/84

Preview text:

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
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 2 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) DAN DBP 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) ◼
Cặp có thứ tự gồm hai ỉnh (u,v) flight HAN HCM
◼ Đỉnh u là ỉnh ầu VN 426
◼ Đỉnh v là ỉnh cuối ◼ Ví dụ, chuyến bay
Cạnh vô hướng (Undirected edge) 1135 HAN HCM ◼
Cặp không có thứ tự gồm 2 ỉnh (u,v) km ◼ Ví dụ, tuyến bay
Đồ thị có hướng (digraph) ◼ Các cạnh có hướng ◼ Ví dụ, mạng truyền tin
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Đồ thị vô hướng (Undirected graph/graph) ◼
Các cạnh không có hướng ◼ Ví dụ, mạng tuyến bay 4 Ứng dụng
Mạch lôgic (Electronic circuits) Phòng máy 1 Phòng máy 2 ◼ Mạch in ◼ Mạch tích hợp Mạng giao thông
(Transportation networks) ◼ Mạng xa lộ ◼ Mạng tuyến bay
Mạng máy tính (Computer networks) ◼ Mạng cục bộ ◼ Internet ◼ Web
Cơ sở dữ liệu (Databases) ◼ Sơ ồ quan hệ thực thể (Entity-relationship diagram) Cuội Chị Hằng
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 5
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Thuật ngữ
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
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 7
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Thuật ngữ (tiếp tục) V a b P 1 U d X Z P 2 h c e W g f Y 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 8
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 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 Chu trình ơn a b
◼ Ngoại trừ ầu trùng cuối, không còn hai ỉnh nào U d X Z giống nhau Ví dụ C 2 h ◼ C1= V,X,Y,W,U là CT ơn e C c 1
◼ C2=U,W,X,Y,W,V là chu trinh W g không là ơn f Y
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 9 Tính chất Tính chất 1
CM: mỗi ỉnh có bậc không quá (n - 1)
Sv deg(v) = 2m
Tương tự có những cận
CM: mỗi cạnh ược ếm 2 lần
cho ồ thị có hướng Tính chất 2
Trong ơn ồ thị vô hướng ( ồ thị
Nguyễn Đức Nghĩa - Bộ môn KHMT
không có cạnh lặp và khuyên) ĐHBKHN
m n (n - 1)/2 Ký hiệu n số ỉnh ◼ m = 6 m số cạnh ◼ deg(v) = 3
deg(v) bậc của ỉnh v Ví dụ ◼ n = 4 10 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 Đức Nghĩa process all vertices adjacent to a given vertex- Bộ môn KHMT ĐHBKHN 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ố, ...)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
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
2 Biểu diễn ồ thị
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 13
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
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
◼ 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
Ma trận kề (Adjacency Matrix) n n ma trận A. thứ tự nào ó.
1 nÕu ( , )i j E A xác ịnh
A i j[ , ] = =aij nÕu tr¸i l¹i bởi: 0 1
Các ỉnh ược ánh số từ 1 ến |V| theo 1 2 12 a b a b 1 2 3 4 1 2 3 4 1 0 1 1 11 0 1 1 1 c d 2 0 0 1 02 1 0 1 c d 0 3 0 0 0 13 1 1 0 1 34 4 0 0 0 0 34 4 1 0 1 0
A = AT ối với ồ thị vô hướng.
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 15 Ma trận kề
◼ Chú ý về sử dụng ma trận kề:
 Dòng toàn không ~ ỉnh cô lập.
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
 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 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 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[ , ] =
c i j(, nÕu (, ), nÕu (i, ji, j)) EE,
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, + , ­ .
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 17
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Ma trận trọng số 1 5 3 6 8 5 6 2 8 5 3 8 6 A= 6 7 3 4 2 2 7 8 18
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 w u b c u w y a v e u v b w b z c x d v y b x e z f f t
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 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) v V
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) v V
Tổng cộng bộ nhớ: (|V |+|E |) 20
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 O(1) 
Xoá cạnh Duyệt qua danh sách kề của mỗi ầu mút. 
Thêm ỉnh Phụ thuộc vào cài ặt. 
Liệt kê các ỉnh kề của v: O() (tốt hơn ma trận kề) 
Hai ỉnh i, j có kề nhau? Tìm kiếm trên danh sách:
(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ề)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 21
Danh sách cạnh (Edge List) 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 Danh sách cạnh 1 8 5 e dau[e] cuoi[e] c[e] 6 1 1 5 6 5 3 2 5 1 8 7 3 4 5 7 4 2 4 1 4 3 5 1 2 5 6 4 3 2
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 7 2 3 8 8 3 2 6
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 23
Đánh giá thời gian thực hiện các thao tác
n ỉnh, m cạnh Edge Adjacency Adjacency ơn ồ thị vô hướng List List Matrix Bộ nhớ
n + m
n + m n2
incidentEdges(v) m deg(v) n
areAdjacent (v, w) m
min(deg(v), deg(w)) 1 insertVertex(o) 1 1 n2
insertEdge(v, w, o) 1 1 1 removeVertex(v) m deg(v) n2 removeEdge(e) 1 1 1 24
3. Các thuật toán duyệt ồ thị
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Graph Searching
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 25 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ị. Ứngdụ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 Ý 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:
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
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).
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 27
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 s V. 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
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
29 Tìm kiếm theo chiều rộng từ ỉnh s BFS_Visit(s) 5 color[s] gray
1. for u V – {s} 6 d[s] 0 2 do color[u] 7 [s] NULL white 8 Q 3 d[u] 9 enqueue(Q,s) 4 [u] NULL 10 while Q 11 do u dequeue(Q)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 12
for v Adj[u] 17 enqueue(Q,v) 13
do if color[v] = 18 color[u] black white 14 then color[v] gray 15 d[v] d[u] + 1 30 16 [v] u
Thuật toán tìm kiếm theo chiều rộng trên ồ thị G BFS(G) 1. for u V 2.
do color[u] white 3. [u] NULL 5. for u V 6.
do if color[u] = white 7.
then BFS-Visit(u)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN
31 Ví dụ: Thực hiện BFS(A)
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN A B F J I C H E D 32 Q = {A} A B F J I C H E D
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN 33
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN Q = {B,F} A B F J I C H E D 34
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN