You are on page 1of 20

ĐỒ THỊ VÀ MỘT SỐ THUẬT GIẢI TRÊN ĐỒ THỊ

TRẦN HÀ SƠN

ĐẠI HỌC KHOA HỌC TỰ NHIÊN-ĐHQG TPHCM

Ngày 8 tháng 5 năm 2023

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 1 / 20


Overview

1 Một số định nghĩa và khái niệm


Đồ thị vô hướng
Đồ thị có hướng

2 Biểu diễn đồ thị

3 Tìm kiếm trên đồ thị


Tìm kiếm theo chiều rộng
Tìm kiếm theo chiều sâu

4 Tìm đường đi ngắn nhất trên đồ thị

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 2 / 20


Đồ thị vô hướng

Định nghĩa (Đồ thị vô hướng)


Một đồ thị vô hướng G là một bộ đôi G = (V , E ), với V là tập các đỉnh
và E là tập các cạnh. Mỗi cạnh là một bộ không sắp thứ tự (v , w ) trong
đó w , v ∈ V . Có thể thêm thành phần thứ ba d vào bộ (v , w ) thành
(v , w , d) biểu diễn trọng số của cung (v , w ).
Ta gọi |V | = n là bậc và |E | = m là kích thước của đồ thị G .

Ví dụ

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 3 / 20


Đồ thị vô hướng

Hình: Đơn đồ thị

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 4 / 20


Đồ thị vô hướng

Ví dụ

(a) Đồ thị có khuyên (b) Đồ thị có cạnh song song

Hình: Đa đồ thị

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 5 / 20


Đồ thị vô hướng

Định nghĩa
Với v ∈ V , bậc của v , kí hiệu d(v ) là số cạnh kề với đỉnh v của G . Lưu ý
rằng khuyên được tính hai lần. Đỉnh với bậc 0 được gọi là đỉnh rời của đồ
thị.

Ví dụ

Đỉnh 1, 5 có bậc 2.
Đỉnh 2, 3, 4, 6 có bậc 3.

Hình: Đa đồ thị chứa khuyên

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 6 / 20


Đồ thị vô hướng

Định lý (Định lý bắt tay cho đồ thị vô hướng)


Cho đồ thị G = (V , E ) với n đỉnh v1 , v2 , . . . , vn và m cạnh. Khi đó
n
X
d(vi ) = 2m.
i=1

Chứng minh.
Gọi N là số cặp (v , e) ∈ V × E sao cho đỉnh v kề với cạnh e. Khi đó nếu
đếm theo đỉnh thì mỗi đỉnh v sẽ thuộc d(v ) cặp như vậy. Do đó
n
X
N= d(v ).
i=1
Nếu đếm theo số cạnh, thì mỗi cạnh e có hai đầu mút nên sẽ thuộc đúng
hai cặp. Do đó N = 2m.
Vậy ta có điều phải chứng minh.
TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 7 / 20
Đồ thị có hướng

Định nghĩa
Một đồ thị có hướng G là một bộ đôi G = (V , E ), với V là tập các đỉnh
và E là tập các cạnh. Mỗi cạnh là một bộ có thứ tự (v , w ) trong đó
w , v ∈ V . Cặp (v , w ) được gọi là cạnh có hướng của G đi từ v vào w . Có
thể thêm thành phần thứ ba d vào bộ (v , w ) thành (v , w , d) biểu diễn
trọng số của cung (v , w ).

Ví dụ

Hình: Đồ thị có hướng


TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 8 / 20
Đồ thị có hướng

Định nghĩa
Cho đồ thị có hướng G = (V , E ).
Số các cạnh đi ra từ một đỉnh v được gọi là bậc ra của đỉnh v , kí
hiệu d + (v ).
Số các cạnh đi vào một đỉnh v được gọi là bậc vào của đỉnh v , kí
hiệu d − (v ).

Định lý (Định lý bắt tay cho đồ thị có hướng)


Cho đồ thị có hướng G = (V , E ), khi đó
X X
d + (v ) = d − (v ) = |E |.
v ∈G v ∈G

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 9 / 20


Biểu diễn đồ thị bởi ma trận kề

Định nghĩa
Cho đồ thị có hướng G = (V , E ). Ma trận kề của đồ thị G là ma trận A
có kích thước |V | × |V |, trong đó mỗi cạnh e = (u, v ) tương ứng với phần
tử khác 0 ở vị trí hàng u cột v của ma trận A. Nghĩa là:

1, (u, v ) ∈ E
A[u, v ] =
0, (u, v ) ∈
/E

Ví dụ

 
0 1 1 0
1 0 1 1
 
1 1 0 0
0 1 0 0
TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 10 / 20
Biểu diễn đồ thị bởi ma trận kề

Ví dụ

 
0 1 1 0
0 0 1 1
 
0 0 0 0
0 0 0 0

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 11 / 20


Biểu diễn đồ thị bởi ma trận trọng số

Ví dụ

 
0 4 7 0
0 0 5 3
 
0 0 0 0
0 0 0 0

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 12 / 20


Biểu diễn đồ thị bởi ma trận liên thuộc đỉnh cạnh

Định nghĩa
Cho đơn đồ thị có hướng G = (V , E ) trong đó V = {1, 2, . . . , n},
E = {e1 , e2 , . . . , em }. Ma trận liên thuộc đỉnh cạnh A của đồ thị G được

 1, nếu i là đỉnh đầu của cung ej
xây dựng như sau: aij −1, nếu i là đỉnh cuối của cung ej

0, nếu i là không là đầu mút của cung ej

Ví dụ

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 13 / 20


Biểu diễn đồ thị bởi danh sách kề

Định nghĩa
Khi cần biểu diễn đồ thị có n đỉnh, m cạnh là đồ thị thưa(m < 6n), người
ta thường sử dụng danh sách kề để biểu diễn đồ thị. Danh sách kề của
đỉnh v là tập
Adj(v ) = {u : (u, v ) ∈ E }.

Ví dụ

Đỉnh Adj(v)
1 2, 3
2 1, 3, 4
3 1, 2
4 2

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 14 / 20


Giải thuật BFS – Breadth first search

BFS là thuật toán cơ bản nhất trong đồ thị, được sử dụng để tìmđường đi
từ một nút bất kỳ đến một nút khác trong đồ thị.
Ý tưởng:
Bắt đầu, đưa nút gốc vào hàng đợi.
Đánh dấu nút gốc đã thăm (visited).
Lặp cho đến khi hàng đợi rỗng.
- Lấy nút đầu hàng đợi và xét mọi nút kề với nó.
- Nếu nút kề chưa được thăm, đưa vào hàng đợi và đánh dấu đã thăm.

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 15 / 20


Giải thuật BFS – Breadth first search

Giải thuật BFS – Breadth first search.


def BFS(v):
QUEUE=[] # Khởi tạo hàng đợi rỗng.
ENQUEUE(v) # Đưa đỉnh v vào hàng đợi.
Chuaxet[v]=False
while (QUEUE != []):
p=DEQUEUE() # Lấy p từ QUEUE
Thăm_đỉnh(p)
for u in Ke(p)
if Chuaxet[u]==True:
ENQUEUE(u)
Chuaxet[u]=False
for v in V:
Chuaxet[v]=True
for v in V:
if Chuaxet[v]==True: BFS(v)
TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 16 / 20
Giải thuật DFS – Depth first search

DFS là thuật toán để duyệt cây trên đồ thị hoặc cấu trúc dữ liệudạng cây.

Ý tưởng.
Tại nút đang xét. Nếu chưa được thăm, đánh dấu đã thăm và lặp lại trên
tất cả các nút lân cận của nó. Lặp lại cho đến khi tất cả các nút được
thăm hoặc nút tìm được nút cần thăm.

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 17 / 20


Giải thuật DFS – Depth first search

Giải thuật DFS – Depth first search.


def DFS(v):
Thăm_đỉnh(v)
Chuaxet[v]=False
for u in Ke(v):
if Chuaxet[u]==True:
DFS(u)
for v in V:
Chuaxet[v]=True
for v in V:
if Chuaxet[v]==True:
DFS(v)

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 18 / 20


Thuật toán Dijkstra

Trong quá trình thực hiện thuật toán, với mỗi đỉnh v ta sẽ lưu trữ nhãn
các đỉnh gồm các thông tin:
1 k[v ]: Biến Boolean nhận True nếu tìm được đường đi ngắn nhất từ s
đến v , ban đầu được khởi tạo là False.
2 d[v ]: Lưu khoảng cách ngắn nhật hiện biết từ s đến v . Ban đầu được
khởi tạo 
+∞, v ̸= s
d[v ] =
0, v = s.
3 prev [v ]: Là đỉnh trước đỉnh v trong đường đi có độ dài d[v ], ban đầu
được khởi tạo là rỗng.

TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 19 / 20


Thuật toán Dijkstra

Thuật toán Dijkstra.


def Dijkstra(s):
for u in V:
d[u]=infinity
p[u]=NULL
k[u]=False
d[s]=0
T=V
while T !=[]:
Chọn đỉnh u thuộc T sao cho d[u] nhỏ nhất
k[u]=True
T=T-{u}
for v in Ke(u):
if (d[v]> d[u]+c[u,v]) and (k[v]==False):
d[v]=d[u]+c[u, v]
prev[v]=u
TRẦN HÀ SƠN (HCMUS) Graph Theory Ngày 8 tháng 5 năm 2023 20 / 20

You might also like