Tải bản đầy đủ (.pdf) (13 trang)

slike bài giảng cấu trúc dữ liệu và giải thuật - đỗ bích diệp chương 8b cấu trúc và đồ thị

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (265.5 KB, 13 trang )

Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 1
Đỗ Bích Diệp - Khoa CNTT
Cấutrúcdữ liệuvàGiảithuật
Chương VIII: CấutrúcĐồ thị
ORD
DFW
SFO
LAX
8
0
2
1
7
4
1
8
4
3
12
33
3
3
7
Đỗ Bích Diệp - Khoa CNTT
Chương VIII: Đồ thị
z Nội dung
1. Các khái niệmcơ bản
2. Biểudiễn đồ thị
1. Ma trậnlâncận


2. Danh sách lân cận
3. Duyệt đồ thị
4. Bàitoánápdụng
1. Tìm cây khung cựctiểu
2. Tìm đường đingắnnhất
3. Bài toán bao đóng truyền ứng
4. Bài toán sắpxếptôpô
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 2
Đỗ Bích Diệp - Khoa CNTT
Đồ thị
– Một đồ thị G = (V, E) trong đó
z V: tậpcácđỉnh (vertices)
z E: tập các cung (edges) nốicácđỉnh trong V
– Một cung e = (u,v) là mộtcặp đỉnh
– Ví dụ:
a b
d
c
e
V= {a,b,c,d,e}
E=
{(a,b),(a,c),(a,d),
(b,e),(c,d),(c,e),
(d,e)}
Đỗ Bích Diệp - Khoa CNTT
Các khái niệm liên quan
– Đồ thị có hướng và Đồ thị vô hướng
12

34
12
3
4
5
Trong một cung, thứ tự của
các đỉnh là quan trọng
Cung (u,v) khác với cung (v,u)
Trong một cung, thứ tự của
các đỉnh là không quan trọng
Cung (u,v) cũng giống như cung (v,u
)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 3
Đỗ Bích Diệp - Khoa CNTT
Các khái niệm liên quan
z Bậccủamột đỉnh (Degree): Là số cung kề với đỉnh
– Trong một đồ thị có hướng, một đỉnh có thể có
z Bậc trong (in-degree)
z Bậc ngoài (out-degree)
– Ví dụ:
z Đỉnh 1 có bậc3
z Đỉnh 1 có bậc trong là 1 và bậc ngoài là 2
12
34
Đỗ Bích Diệp - Khoa CNTT
Các khái niệm liên quan
z Đỉnh lân cận (Adjacent vertices)
– Trong đồ thị

z 1, 2 là lân cậncủanhau
z 1,3 là lân cậncủanhau
z ….
z Cung kề (Incident edges)
– Nếu có cung (u,v) thì cung này là cung kề của hai đỉnh u
và v
12
34
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 4
Đỗ Bích Diệp - Khoa CNTT
Các khái niệm liên quan
z Đường đi
– Dãy các đỉnh v
1
,v
2
,. . .v
k
mà tồntại cung (v
i
, v
i+1
) trong đồ
thị ( i = 1 k-1)
z Đường đi đơn
– Đường đivớicácđỉnh không lặplại
z Chu trình
– Đường đi đơnvới đỉnh đầuvàcuối

trùng nhau
z Độ dài đường đi
– Số cung trên đường đi
z Đồ thị con
12
34
Path : 1, 2, 4, 3, 1, 4
Đỗ Bích Diệp - Khoa CNTT
Các khái niệm liên quan
z Đồ thị liên thông (Connected Graph)
12
3
4
5
12
34
Đồ thị liên thông
12
3
12
3
4
5
Đồ thị không liên thông
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 5
Đỗ Bích Diệp - Khoa CNTT
Các khái niệm liên quan
z Đồ thị trọng số (Weight Graph)

12
34
5
60
100100
110
140
Đỗ Bích Diệp - Khoa CNTT
Kiểudữ liệutrừutượng Đồ thị
z Dữ liệu: Mộttập không rỗng các đỉnh chứacácphầntử
có kiểunhất định, mộttập không rỗng các cung có thể
biểudiễncácphầntử có kiểunhất định
z Các thao tác cơ bản
– Graph create()
– insertVertex( o)
– insertEdge(u, v, o)
– removeVertex(v)
– removeEdge(e )
– endVertices(e)
– opposite(v, e)
– areAdjacent(v, w)
– adjacentVertices(v)
– incidentEdges(v)
– vertices()
– edges()
– numVertices()
– numEdges()
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 6

Đỗ Bích Diệp - Khoa CNTT
Mộtsố tính chấtcủa đồ thị
1. Nếumột đồ thị G có m cung thì tổng bậccủa
các đỉnh trong G sẽ là 2m
2. Nếumột đồ thị có hướng có m cung thì tổng bậc
trong củacácđỉnh , tổng bậc ngoài củacácđỉnh
đềulàm
3. Nếu đồ thị G là đồ thịđơngiản, G có n đỉnh và
m cung thì
1. NếuG làđồ thị vô hướng m ≤ n(n-1)/2
2. NếuG làđồ thị có hướng thì m ≤ n(n-1)
Đỗ Bích Diệp - Khoa CNTT
Biểudiễn đồ thị
– Biểudiễnbằng ma trậnlâncận
z Đánh số các đỉnh trong tậpV từ 1 đếnn
z Ma trậnbiểudiễn đồ thị A (n x n)
– A
ij
= 1 nếu trong G tồntại cung (i,j)
– A
ịj
= 0 nếu trong G không tồntại cung đó
z Với đồ thị vô hướng thì nếuA
ij
= 1 thì A
ji
= 1
z A đượcgọilàma trậnlâncậncủaG
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK

HN 7
Đỗ Bích Diệp - Khoa CNTT
Biểudiễn đồ thị bằng ma trậnlâncận
z Ví dụ
12
34












0110
0011
1000
1010
12
3
4
5

















01001
10100
01011
00101
10110
Đỗ Bích Diệp - Khoa CNTT
Biểudiễn đồ thị bằng danh sách lân cận
– Biểudiễnbằng danh sách lân cận
z Mỗi đỉnh trong đồ thị sẽứng vớimột danh sách móc nốichứa
các đỉnh lân cậncủanó
z Mỗi nút trong danh sách có quy cách
– VERTEX chứagiátrị tương ứng vớisố thứ tự của đỉnh lân cận
– LINK chứa con trỏ trỏ tới nút tiếp theo trong danh sách
z Mỗidanhsáchnhư vậycómộtnútđầudanhsách
z Các nút đầunàylàcácphầntử củamột vector V có kích
thướcn. Phầntử V[i] ứng với danh sách lân cậncủanútthứ i
LINKVERTEX
Cấu trúc dữ liệu và Giải thuật

Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 8
Đỗ Bích Diệp - Khoa CNTT
Biểudiễn đồ thị bằng danh sách lân cận
z Ví dụ
z 1: (2,4)
2: (4)
3: (1, 2)
4: (2, 3)
12
34
V[1]
V[2]
V[3]
V[4]
24
4
12
2
3
Đỗ Bích Diệp - Khoa CNTT
Biểudiễn đồ thị bằng danh sách lân cận
z 1: (2,3,5)
2: (1,3)
3: (1,2,4)
4: (3,5)
5: (1,4)
12
3
4

5
2 3 5
1
1
3
1
2
3
5
4
4
V[1]
V[2]
V[3]
V[4]
V[5]
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 9
Đỗ Bích Diệp - Khoa CNTT
Phép duyệt đồ thị
z Cho một đồ thị G(V,E) và một đỉnh v thuộcV. Duyệt
đồ thị là thămmọi đỉnh liên thông vớiv
– Có 2 phương pháp
z Phương pháp duyệttheochiều sâu (Depth First Search)
z Phương pháp duyệttheochiềurộng ( Breadth First Search)
Đỗ Bích Diệp - Khoa CNTT
Duyệt theo chiều sâu
Algorithm DFS(G, v)
Input đồ thị G và đỉnh bắt đầu duyệt v trong G

Output đánh dấu các cung trong G trong phần đồ thị liênthôngvới đỉnh v
thành hai loại cung khám phá (discovery edges) và cung quay lui (back
edges)
setLabel(v, VISITED) // đỉnh v đã đượcthăm
for all e ∈ G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w ← opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
DFS(G, w)
else
setLabel(e, BACK)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 10
Đỗ Bích Diệp - Khoa CNTT
Duyệt đồ thị theo chiều sâu
DB
A
C
E
D
B
A
C
E
D
B
A
C

E
Cung khám phá
Cung quay lui
A
Đỉnh đãthăm
A
Đỉnh chưathăm
Cung chưathăm
Bắt đầuxuấtpháttừ A
Đỗ Bích Diệp - Khoa CNTT
Duyệt đồ thị theo chiều sâu
DB
A
C
E
DB
A
C
E
DB
A
C
E
D
B
A
C
E
Tấtcả các cung
kề củaD đãduyệt

Xét tiếpcáccung
kề của đỉnh C
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 11
Đỗ Bích Diệp - Khoa CNTT
Duyệt đồ thị theo chiều sâu
z Duyệt theo chiều sâu trên đồ thị có hướng
– Đi theo chiềucủa các cung trên đồ thị
A
B
D
C
E
Đỗ Bích Diệp - Khoa CNTT
Duyệt đồ thị theo chiềurộng
Algorithm BFS(G, s)
Q = một queue rỗng
Q.enqueue(s)
setLabel(s, VISITED)
while not Q.isEmpty()
v = Q.dequeue()
for all e ∈ G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w ← opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
setLabel(w, VISITED)
Q.enqueue(w)
else

setLabel(e, BACK)
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 12
Đỗ Bích Diệp - Khoa CNTT
Duyệt đồ thị theo chiềurộng
C
B
A
E
D
Cung khám phá
Cung quay lui
A
Đỉnh đãthăm
A
Đỉnh chưathăm
Cung chưathăm
L
0
L
1
F
CB
A
E
D
L
0
L

1
F
CB
A
E
D
L
0
L
1
F
Đỗ Bích Diệp - Khoa CNTT
Duyệt đồ thị theo chiềurộng
CB
A
E
D
L
0
L
1
F
CB
A
E
D
L
0
L
1

F
L
2
CB
A
E
D
L
0
L
1
F
L
2
CB
A
E
D
L
0
L
1
F
L
2
Cấu trúc dữ liệu và Giải thuật
Đỗ Bích Diệp - Khoa CNTT - ĐHBK
HN 13
Đỗ Bích Diệp - Khoa CNTT
Duyệt đồ thị theo chiềurộng

CB
A
E
D
L
0
L
1
F
L
2
CB
A
E
D
L
0
L
1
F
L
2
CB
A
E
D
L
0
L
1

F
L
2
Đỗ Bích Diệp - Khoa CNTT
Duyệt đồ thị theo chiều sâu
z Duyệt đồ thị theo chiềurộng trên đồ thị có hướng
A
B
D
C
E

×