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

Bài giảng Cấu trúc dữ liệu và thuật toán: Chương 7 - Trịnh Anh Phúc

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 (1.55 MB, 140 trang )

CHƯƠNG 7

Đồ thị và các thuật toán đồ thị
HAN

HP

CuuDuongThanCong.com

HCM

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


CuuDuongThanCong.com

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)

HAP

DBP

DAN
HCM


HAN

BKK

NHT
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

VIN

3


Các kiểu cạnh
Cạnh có hướng (Directed edge)
 Cặp có thứ tự gồm hai đỉnh (u,v)
 Đỉnh u là đỉnh đầu
 Đỉnh v là đỉnh cuối
 Ví dụ, chuyến bay
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


HAN

flight
VN 426

HCM

HAN

1135
km

HCM

CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

4


Ứng dụng
Mạch lôgic (Electronic circuits)





Phòng máy 2


Mạch in
Mạch tích hợp

Phòng hành chính

Mạng giao thông (Transportation
networks)


Phòng máy 1

Mạng xa lộ
Mạng tuyến bay

Phòng Giáo vụ

Mạng máy tính (Computer
networks)




Trường ĐHQG
Ban Giám đốc

Mạng cục bộ
Internet
Web


Phòng Tuyên huấn

Cơ sở dữ liệu (Databases)


Tổ Tin

Sơ đồ quan hệ thực thể
(Entity-relationship diagram)

Bờm
Cuội

Chị Hằng

CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

5


Thuật ngữ
Đầu mút của cạnh


U và V là các đầu mút của cạnh a

Cạnh kề với đỉnh



a, d, và b kề với đỉnh V

Đỉnh kề


U và V là kề nhau

Bậc của đỉnh


a
U

V
d

e

W

X có bậc 5

j
Z

i
g

f


h và i là các cạnh lặp

Khuyên


h
X

c

Cạnh lặp


b

Y

j là khuyên

Đơn đồ thị: Không chứa cạnh lặp và khuyên
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

6


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
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

7


Thuật ngữ (tiếp tục)
V

a
U
c

b

d
P2

P1
X


e

W

h

Z

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
CuuDuongThanCong.com

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

a

Chu trình đơn


Ngoại trừ đầu trùng cuối,
không còn hai đỉnh nào
giống nhau

U

Ví dụ



C1= V,X,Y,W,U là CT đơn
C2=U,W,X,Y,W,V là chu trinh
không là đơn

c

V

b

d
C2


X
e

C1
g

W
f

h

Z

Y

CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

9


Tính chất
Tính chất 1

Ký hiệu

Sv deg(v) = 2m
CM: mỗi cạnh được đếm 2 lần


Tính chất 2
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)

n
m
deg(v)

số đỉnh
số cạnh
bậc của đỉnh v

Ví dụ




n=4
m=6
deg(v) = 3

Tương tự có những cận cho
đồ thị có hướng
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN


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
process all vertices adjacent to a given vertex
11
Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN


CuuDuongThanCong.com


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, ...
...
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

12


2 Biểu diễn đồ thị

CuuDuongThanCong.com

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

 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 ?
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

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
thứ tự nào đó.
n Õ u (i, j )  E
1
A [i, j ] = a = 
A xác định bởi:
ij

1

a

3

c


b

2

d4

1
2
3
4

1
0
0
0
0

2
1
0
0
0

3
1
1
0
0

4

1
0
1
0

1

3

0

a

b

c

d

n Õ u tr¸ i l¹ i

2

4

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 = AT đối với đồ thị vô hướng.
CuuDuongThanCong.com

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.
 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).
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

16



Ma trn trng s
Trong trng hp th cú trng s trờn cnh, thay vỡ ma
trn k, biu din th ta s dng ma trn trng 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, +, -.
CuuDuongThanCong.com

Nguyn c Ngha - B mụn KHMT HBKHN

17


Ma trận trọng số
Ví dụ
1

8

5

6


2

3

5

8

7

6
3

4

2





A = 



8


5




3



8



6







2









6 




 

7

 

CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

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
u

v
w

v

w

u

w

u

v

x

z

y

v

z

Đồ thị có hướng
a

y


b
c

e
f

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

c

e
b

d

x

t

b

b
f

CuuDuongThanCong.com

19


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 |)
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN


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(<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 là O(|V |) => không
hiệu quả (tồi hơn ma trận kề)
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

21



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ế
CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

22


Danh sách cạnh

1

8

5

6


2

3

5

8

7

6
3

4

2

e
1
2
3
4
5
6
7
8

dau[e]
1

5
4
1
1
4
2
3

cuoi[e]
5
1
5
4
2
3
3
2

c[e]
6
8
7
3
5
2
8
6

CuuDuongThanCong.com


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ô hướng

Edge
List

Adjacency
List

Adjacency
Matrix

Bộ nhớ

n+m

n+m

n2

incidentEdges(v)
areAdjacent (v, w)
insertVertex(o)


m
m
1

deg(v)
min(deg(v), deg(w))
1

n
1
n2

insertEdge(v, w, o)

1

1

1

removeVertex(v)
removeEdge(e)

m
1

deg(v)
1

n2

1

CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

24


3. Các thuật toán duyệt đồ thị
Graph Searching

CuuDuongThanCong.com

Nguyễn Đức Nghĩa - Bộ môn KHMT ĐHBKHN

25


×