Professional Documents
Culture Documents
Tháng 4, 2023
Khái niệm đồ thị
Các cách biểu diễn đồ thị trên máy tính
Giới thiệu một số thuật toán trên đồ thị
Định nghĩa 1:
Đồ thị G là một cặp (V , E ) bao gồm:
Tập hợp hữu hạn V ̸= ∅, phần tử của V được gọi là đỉnh
Tập hợp E ⊆ V × V ; e = (a, b) ∈ E được gọi là cạnh với a, b là các đầu mút
Ngoài ra:
Nếu (a, b) ∈ E thì ta nói đỉnh b kề với đỉnh a.
Nếu e = (a, a) ∈ E thì ta nói e là một khuyên.
Cặp đỉnh (a, b) ∈ E không sắp thứ tự được gọi là cạnh vô hướng, còn nếu nó có
sắp thứ tự thì được gọi là cạnh có hướng.
Như vậy:
Đồ thị chỉ chứa các cạnh vô hướng được gọi là đồ thị vô hướng.
Đồ thị chỉ chứa các cạnh có hướng được gọi là đồ thị có hướng.
Hải Âu Đồ thị và các thuật toán trên đồ thị
Khái niệm đồ thị
Các cách biểu diễn đồ thị trên máy tính
Giới thiệu một số thuật toán trên đồ thị
Định nghĩa 2
Một đồ thị không có khuyên, trong đó mỗi cặp đỉnh được nối với nhau bởi không quá
một cạnh được gọi là đơn đồ thị, còn nếu không, nó được gọi là đa đồ thị.
deg + (v ) = |{u ∈ V : (v , u) ∈ E }|
là bậc ngoài của v thể hiện cho số các cung xuất phát từ v và
Định nghĩa 4
Đường đi trong đồ thị là một dãy các đỉnh:
v1 , v2 , v3 , ..., vn
sao cho mỗi đỉnh trong dãy kề với đỉnh liền trước nó.
Ngoài ra:
Hai đỉnh của đồ thị được gọi là liên thông nếu trên đồ thị đó có đường đi vô
hướng từ đỉnh này đến đỉnh kia.
Số cạnh của đường đi là độ dài của đường đi đó.
Đường đi đơn là đường đi mà các đỉnh trên nó đôi một khác nhau.
Đường đi có đỉnh đầu trùng với đỉnh cuối được gọi là chu trình.
Hải Âu Đồ thị và các thuật toán trên đồ thị
Khái niệm đồ thị
Các cách biểu diễn đồ thị trên máy tính
Giới thiệu một số thuật toán trên đồ thị
Định nghĩa 5
Với đồ thị G = (V , E ) và V = {1, 2, 3, ..., n}. Ma trận A = [aij ]n×n là ma trận kề của
đồ thị G , trong đó aij là số cạnh nối đỉnh i với đỉnh j trong G với mọi i, j ∈ V .
1 0 3 0
0 1 2 1
Chẳng hạn, A = 0 0 0 1 là ma trận kề của đa đồ thị sau:
1 0 1 0
Định lý 1
Đồ thị G có ma trận kề là A. Khi đó, phần tử hàng i cột j của ma trận lũy thừa Ak là
số các đường đi khác nhau có độ dài k từ đỉnh i đến đỉnh j.
Chứng minh:
Với k = 1, hiển nhiên đúng.
Giả sử mệnh đề đúng với k ≥ 1. Đặt A = [aij ]n×n , Ak = [bij ]n×n , Ak+1 = [cij ]n×n .
n
X
Khi đó, ta có cij = biq aqj .
q=1
Với mỗi 1 ≤ q ≤ n thì biq là số đường đi khác nhau có độ dài k từ đỉnh i đến đỉnh q và
aqj là số cạnh nối đỉnh q với đỉnh j. Nên khi q lần lượt là các đỉnh 1, 2, 3, ..., n thì cij là
số lượng tất cả các đường đi khác nhau có độ dài đúng bằng k + 1 từ đỉnh i đến đỉnh j.
Nếu đồ thị G = (V , E ) có trọng số, nghĩa là mỗi cặp (i, j) ∈ E được gán với một
số thực mij thì ma trận trọng số của G là A = [aij ]n×n xác định bởi:
(
mij , ∀(i, j) ∈ E
aij =
0, ∀(i, j) ̸∈ E
Nếu ta chỉ quan tâm đến tính chất có hay không đường đi giữa các đỉnh của đồ
thị G = (V , E ) thì ta sử dụng ma trận kề logic của G là A = [aij ]n×n xác định bởi:
(
1, ∀(i, j) ∈ E
aij =
0, ∀(i, j) ̸∈ E
Nhận xét:
Xm
aij = deg (vi )
j=1
Xn
aij = 2
i=1
Nhận xét:
Xm
aij = deg − (vi ) − deg + (vi )
j=1
n
X
aij = 0
i=1
Hải Âu Đồ thị và các thuật toán trên đồ thị
Khái niệm đồ thị
Các cách biểu diễn đồ thị trên máy tính
Giới thiệu một số thuật toán trên đồ thị
Định lý 2
Đơn đồ thị định hướng G có ma trận liên thuộc là Bn×m . Khi đó ma trận
L = [ℓij ]n×n = BB T có tính chất sau:
deg (vi ), nếu i = j
ℓij = −1, nếu i ̸= j và hai đỉnh vi , vj kề nhau
0, còn lại
Ưu điểm:
Các thao tác cơ bản như: thêm một cạnh, xóa một cạnh và kiểm tra xem có
đường đi từ đỉnh i đến đỉnh j hay không có độ phức tạp O(1), cực kỳ hiệu quả.
Bằng cách thực hiện các phép toán trên ma trận kề, ta có được hiểu biết về tính
chất của đồ thị, mối quan hệ giữa các đỉnh của nó.
Nhược điểm:
Ta luôn luôn phải sử dụng một mảng có kích thước |V |2 để lưu trữ đồ thị gây
lãng phí bộ nhớ khi đồ thị có số lượng đỉnh rất lớn.
Các thao tác như: thêm một đỉnh, bỏ đi một đỉnh,... mất nhiều thời gian thực thi.
Khi nào sử dụng ma trận kề?
Khi đồ thị có số lượng đỉnh bé hoặc đồ thị dày đặc, có số cạnh quá lớn.
Khi ta thường xuyên phải kiểm tra đường đi giữa các đỉnh của đồ thị.
Với mỗi v ∈ V , ta lưu trữ danh sách các đỉnh kề với v là:
adj(v ) = {u ∈ V : (v , u) ∈ E }
Tính chất:
Đối với đồ thị có hướng, tổng số phần tử trong tất cả danh sách kề là:
X X
|adj(v )| = deg + (v ) = |E |
v ∈V v ∈V
Đối với đồ thị vô hướng, tổng số phần trong tất cả danh sách kề là:
X X
|adj(v )| = deg (v ) = 2|E |
v ∈V v ∈V
Ưu điểm:
Tiêu tốn bộ nhớ là O(|V | + |E |), trong nhiều trường hợp tốt hơn ma trận kề.
Hiệu quả khi liệt kê tất cả các đỉnh kề với một đỉnh.
Nhược điểm:
Tình huống tồi tệ nhất, mất O(|V |) để xem xét hai đỉnh có kề nhau không.
Khi nào sử dụng danh sách kề?
Khi số đỉnh lớn, số cạnh bé hoặc số cạnh không quá lớn so với số đỉnh.
Khi ma trận kề không hiệu quả.
Mô tả thuật toán:
Với G = (V , E ) là đồ thị và v0 là một đỉnh nào đó của G . Kí hiệu L là một cấu trúc
dữ liệu kiểu danh sách dùng để chứa các đỉnh.
1 L = ∅;
2 L ← {v0 };
3 Lấy đỉnh v ra khỏi L;
4 Duyệt đỉnh v ;
5 Nạp các đỉnh của f (v ) vào L;
6 Nếu L ̸= ∅ thì quay lại bước 2;
7 Dừng.
Mục đích: Khảo sát tính chất của đồ thị.
Begin
Đánh dấu trạng thái chưa thăm cho tất cả các đỉnh
Đưa đỉnh bắt đầu vào ngăn xếp
while ngăn xếp ̸= ∅, do
phần tử đầu tiên của ngăn xếp đặt là u
xem xét u
if u chưa được thăm, then
đánh dấu u là đã thăm
for tất cả các đỉnh i kề u, do if ith vertex is unvisited, then push ith vertex
into the stack mark ith vertex as visited done done End