You are on page 1of 70

CẤU TRÚC DỮ LIỆU&

GIẢI THUẬT
ĐH HUTECH
KHOA CNTT
GV: TS. HUỲNH MINH TRÍ
BÀI 06:
ĐỒ THỊ VÀ BIỂU DIỄN ĐỒ THỊ

10/6/2023 2
Nội dung Bài 06
6.1. Định nghĩa đồ thị
6.2. Các thuật ngữ cơ bản
6.3. Đường đi, chu trình, đồ thị liên thông
6.4. Biểu diễn đồ thị
6.5. Bài tập

10/6/2023 3
6.1. Định nghĩa đồ thị (1)
▪ Bài toán Euler
Konigsber (1736)

Có thể chỉ một lần đi qua tất cả 7 chiếc cầu này hay không?
10/6/2023 4
6.1. Định nghĩa đồ thị (2)
▪ Chuyển bài toán về dạng đồ thị
 Mỗi vùng là 1 đỉnh
 Mỗi chiếc cầu là 1 cạnh

10/6/2023 5
6.1. Định nghĩa đồ thị (3)
▪ Đồ thị được xây dựng từ bài toán Euler
 Có thể đi qua tất cả các cạnh của đồ thị, sao cho mỗi
cạnh chỉ đi qua đúng một lần được không?

10/6/2023 6
6.1. Định nghĩa đồ thị (4)
▪ Định nghĩa
 Đồ thị G là một tập hợp gồm các đỉnh và các cạnh. Ta
thường ký hiệu: G = (V, E), trong đó:
+ V: Là tập các đỉnh (vetex/vertices)
+ E: Là tập các cạnh (edges)

V={1, 2, 3, 4}
E={a, b, c, d, e}
10/6/2023 7
6.1. Định nghĩa đồ thị (5)
▪ Các loại Đồ thị
đồ thị
Đồ thị vô hướng

Đơn đồ thị Đa đồ thị Giả đồ thị

Đồ thị có hướng

10/6/2023
Đơn đồ thị Đa đồ thị 8
6.1. Định nghĩa đồ thị (6)
▪ Đơn đồ thị vô huớng
Đồ thị G=(V, E) được gọi là đơn đồ
thị vô hướng:
 V: Là tập các đỉnh (vertex/vertices)
 E: là tập các cạnh (edges) cặp
không có thứ tự gồm hai phần tử
khác nhau của V. V={1, 2, 3, 4, 5}
 Cạnh nối 2 đinh u, v E={(1, 2), (1, 3), (1, 5), (2, 5),
Kí hiệu : uv hay (u, v) (3, 4), (3, 5), (4, 5)} hay
10/6/2023
E={12, 13, 15, 25, 34, 35, 45} 9
6.1. Định nghĩa đồ thị (7)
▪ Đa đồ thị vô huớng
Đồ thị G=(V, E) được gọi là đa
đồ thị vô hướng:
 V: Là tập các đỉnh
 E: Là tập các cặp không có
thứ tự gồm hai phần tử V={1, 2, 3, 4, 5}
khác nhau của V. E={(1, 2), (1, 3), (1, 5), (2, 5), (3, 4),
Hai cạnh e1, e2 gọi là (3, 5), (4, 5), (1, 2), (2, 1), (5, 2), (3, 5) }
hay
cạnh lặp hay cạnh song
E={ 12, 13, 15, 25, 34, 35, 45, 12, 21,
song nếu chúng cùng tương
52, 35 }
ứng với một cặp đỉnh
10/6/2023 10
6.1. Định nghĩa đồ thị (8)
▪ Giả đồ thị vô huớng
Đồ thị G=(V, E) được gọi là giả
đồ thị vô hướng:
 V: Là tập các đỉnh
 E: Là tập các cặp không có thứ
tự gồm hai phần tử không nhất
thiết khác nhau của V. V={1, 2, 3, 4, 5}
Cạnh e được gọi là khuyên E={(1, 2), (1, 3), (1, 5), (2, 5),
nếu nó có dạng: (3, 4), (3, 5), (4, 5), (1, 2), (2, 1),
(5, 2), (3, 5), (2, 2), (3, 3) }
e=(u, u) hay uu
10/6/2023 11
6.1. Định nghĩa đồ thị (9)
▪ Đơn đồ thị có hướng
Đồ thị G=(V, E) được gọi là
đơn đồ thị có hướng:
 V: Là tập các đỉnh
 E: Là tập các cặp có thứ tự
gồm hai phần tử khác nhau
của V. (tập các cung)

V={1, 2, 3, 4, 5}
E={(2, 1), (3, 2), (5, 1), (1, 4), (5, 2), (4, 3), (5, 4)}
10/6/2023 12
6.1. Định nghĩa đồ thị (10)
▪ Đa đồ thị có hướng
Đồ thị G=(V, E) được gọi là đa đồ thị
có hướng:
 V: Là tập các đỉnh
 E: Là họ các cặp có thứ tự gồm
hai phần tử khác nhau của V. (tập
các cung) V={1, 2, 3, 4, 5}
Hai cung e1, e2 được gọi là cung E={(2, 1), (1, 3), (6, 2), (3, 4),
lặp hay song song nếu chúng (6, 3), (4, 6), (5, 4), (5, 6),
(3,1), (6,2)}
cùng tương ứng với một cặp đỉnh.
10/6/2023 13
6.1. Định nghĩa đồ thị (11)
Đồ thị Không có thứ tự

Đồ thị vô hướng
Không cạnh lặp, không khuyên
Đơn đồ thị
▪ Tổng kết Đa đồ thị
Có cạnh lặp, không khuyên

Có cạnh lặp, Có khuyên


Giả đồ thị
Có thứ tự
Đồ thị có hướng
Không cung lặp,không khuyên
Đơn đồ thị
Có cung lặp, không khuyên 14
10/6/2023 Đa đồ thị
6.2. Các thuật ngữ cơ bản (1)
▪ Kề và liên thuộc Không có thứ tự
 Giả sử u và v là hai đỉnh của đồ thị vô hướng G và
e=(u, v) là cạnh của đồ thị,khi đó ta nói:
+ u và v kề nhau và e liên thuộc với
Có u và v.
cạnh lặp, không khuyên
+ u và v là các đỉnh đầu của cạnh e
v
e
u
10/6/2023 15
6.2. Các thuật ngữ cơ bản (2)
▪ Bậc của đỉnh Không có thứ tự
• Bậc của đỉnh v trong đồ
thị vô hướng là số cạnh
liên thuộc với nó.
• Ký hiệu: deg(v) Có cạnh lặp, không khuyên

 Đỉnh treo là đỉnh chỉ có duy


nhất một cạnh liên thuộc với nó.
 Đỉnh cô lập là đỉnh không có deg(1)= 2, deg(2)= 2,
cạnh nào liên thuộc với nó. deg(3)= 3, deg(4)= 3,
deg(5)= 3, deg(6)= 1, deg(7)= 0.
10/6/2023 16
6.2. Các thuật ngữ cơ bản (2)
Không có thứ tự
deg(1)= 2, deg(2)= 2,
deg(3)= 3, deg(4)= 5,
deg(5)= 3, deg(6)= 1,
deg(7)= 0.
Có cạnh lặp, không khuyên
Đỉnh treo: 6.
Đỉnh cô lập: 7.
Ghi chú: Khuyên tại đỉnh 4
được tính bậc là 2.

10/6/2023 17
6.2. Các thuật ngữ cơ bản (3)
Định lý bắt tay Không có thứ tự
Giả sử G=(V,E) là đồ thị vô hướng với m cạnh.
Khi đó tổng tất cả các bậc của đỉnh trong V bằng 2m.

 deg(v) = 2m Có cạnh lặp, không khuyên


vV
m=7

 deg(v) = 2m = 14
vV
10/6/2023 18
6.2. Các thuật ngữ cơ bản (4)
Không có thứ tự
Định lý bắt tay
Chứng minh
Mỗi một cạnh nối với đúng hai đỉnh, vì thế một cạnh đóng
Có cạnh lặp, không khuyên
góp 2 đơn vị vào tổng các bậc của tất cả các đỉnh. Suy ra
tổng các bậc của tất cả các đỉnh gấp đôi số cạnh của đồ thị

10/6/2023 19
6.2. Các thuật ngữ cơ bản (5)
Hệ quả của định lý bắt tay Không có thứ tự

Trong đồ thị vô hướng, số đỉnh bậc lẻ là một số chẵn.

Có cạnh lặp, không khuyên


4 đỉnh đỉnh bậc lẻ:
3, 5, 4, 6

10/6/2023 20
6.2. Các thuật ngữ cơ bản (6)
Hệ quả của định lý bắt tay Không có thứ tự
Trong đồ thị vô hướng, số đỉnh bậc lẻ là một số chẵn.
Chứng minh:
Gọi L và C lần lượt là tập các đỉnh bậc
Cólẻ và bậc
cạnh chẵn của
lặp, không đồ thị
khuyên
vô hướng G= (V, E). Ta có:
2m = deg(v) = deg(v) + deg(v)→ deg(v) = 2m - deg(v)
vV vL vC vL vC
= chẵn – chẵn → deg(v) = chẵn→ số lượng đỉnh bậc lẻ là chẵn.
vL
10/6/2023 lẻ 21
6.2. Các thuật ngữ cơ bản (7)
▪ Kề trong đồ thị có hướng Không có thứ tự

 Giả sử u và v là hai đỉnh của đồ thị có hướng G


và kí hiệu e=(u, v) hay uv là một cung của đồ
v
thị, khi đó ta nói: Có cạnh lặp, không khuyên
+ u và v kề nhau, cung e đi ra khỏi u và đi vào v.
+ u là đỉnh đầu (đỉnh gốc), e
v là đỉnh cuối (đỉnh ngọn) của cung e.
+ v còn được gọi là đỉnh sau của u.
10/6/2023
u 22
6.2. Các thuật ngữ cơ bản (8)
▪ Bán bậc vào và bán bậc ra của đỉnhKhông có thứ tự
 Bán bậc ra (bán bậc vào) của đỉnh v trong đồ thị có
hướng là số cung ra khỏi nó (đi vào nó).
 Ký hiệu: deg + (v) (deg - (v))
▪ Bậc của đỉnh: Có cạnh lặp, không khuyên

deg(v) = deg + (v) + deg - (v)


deg + (2) = 1, deg − (2) = 2
→ deg (2) = 3
+ −
deg (6) = 2, deg (6) = 1→ deg (6) =3 23
10/6/2023
6.2. Các thuật ngữ cơ bản (9)
Định lý: Giả sử G=(V,E) là đồ thị có hướng
Khôngvớicómthứ
cung,
tự khi
đó tổng tất cả các bán bậc ra bằng tổng tất cả các bán bậc vào
và bằng m.
 deg +
(v) =  degCó cạnh

= mkhông khuyên
(v) lặp,
vV vV
+
 deg (v) = 7
vV

 deg (v) = 7
10/6/2023 vV 24
6.2. Các thuật ngữ cơ bản (10)
Một số tính chất khác về bậc của đỉnhKhông
đồ thịcó thứ tự
1. Nếu đồ thị có nhiều hơn 2 đỉnh thì có ít nhất 2 đỉnh cùng bậc
2. Nếu đồ thị với n đỉnh (n>2) có đúng 2 đỉnh cùng bậc thì 2
đỉnh này không thể có bậc 0 hoặc n-1 Có cạnh lặp, không khuyên
3. Luôn tồn tại đồ thị n đỉnh (n>2) mà 3 đỉnh bất kỳ của đồ thị
đều không cùng bậc
4. G = (V, E) với ít nhất kn+1 đỉnh, mỗi đỉnh có bậc không
< (k-1)n+1, luôn tồn tại đồ thị con đầy đủ của G gồm k+1 đỉnh
10/6/2023 25
6.2. Các thuật ngữ cơ bản (11)
▪ Bài tập Không có thứ tự
1. Có bao nhiêu cạnh trong đồ thị có 10 đỉnh, mỗi đỉnh có
bậc bằng 6
a) 20 b) 30 c) 40 Có cạnhd)50lặp, không khuyên
2. Cho biết các đỉnh của đồ thị có bậc lần lượt là: 4, 3, 3, 2, 2.
Số cạnh của đồ thị này là:
a) 5 b) 6 c) 7 d) 8

10/6/2023 26
6.2. Các thuật ngữ cơ bản (12)
▪ Bài tập Không có thứ tự
3.Cho danh sách bậc các đỉnh của các đồ thị sau, đồ thị nào
không tồn tại?
a) 3, 3, 3, 3, 2 b) 1, 2, 3, 4, 5
Có cạnh lặp, không khuyên
c) 0, 1, 2, 2, 3 d) 1, 1, 1, 1
4. Có thể tồn tại đồ thị đơn 15 đỉnh, mỗi đỉnh có bậc bằng 5 hay
không?
5. Trong một giải thi đấu có n đội tham dự và đã có n+1 trận đấu
được tiến hành. CMR có 1 đội đã thi đấu ít nhất 3 trận.
10/6/2023 27
6.3. Đường đi, chu trình, đồ thị liên thông (1)
▪ Đường đi độ dài n từ đỉnh u đến đỉnh vKhông trên đồ thị vô
có thứ tự
hướng G=(V,E) có 2 cách biểu diễn 1 đường đi
Cách 1: (theo đỉnh) là dãy các đỉnh
x0, x1, …, xn-1, xn
Trong đó: Theo đỉnh:
+ u= x0 ; v= xn (1, 3, 4, 5, 6)
+ (xi, xi+1)  E Theo cạnh:
(b, c, h, g)
Cách 2: (theo cạnh)
(x0, x1), (x1, x2), …, (xn-1, xn).
Khi đó: u gọi là đỉnh đầu, v gọi là đỉnh cuối của đường đi.
10/6/2023 28
6.3. Đường đi, chu trình, đồ thị liên thông (2)
 Đường đi có đỉnh đầu và đỉnh cuối trùng
Không
nhaucógọi
thứlàtựchu trình.

 Đường đi (hay chu trình) được gọi là đơn nếu nó không đi qua
một cạnh nào quá một lần.
 Đường đi (hay chu trình) gọi là sơ cấp nếu nó không đi qua
đỉnh nào quá 1 lần (trừ đỉnh đầu và đỉnh cuối).

10/6/2023 29
6.3. Đường đi, chu trình, đồ thị liên thông (3)
Chu trình đơn và sơ cấp: Không có thứ tự

(1, 2, 6, 3, 1)
Chu trình không phải chu trình đơn
và không là sơ cấp: (2, 6, 4, 3, 6, 2).
Đường đi đơn nhưng không sơ cấp :
(1, 3, 6, 4, 3).

10/6/2023 30
6.3. Đường đi, chu trình, đồ thị liên thông (4)
 Đường đi và chu trình trong đồ thị 2 tự
Không có thứ
a 4
có hướng
1
Đường đi độ dài n (nN+) từ đỉnh u c
g
đến đỉnh v trên đồ thị có hướng f
b
G=(V,E) là dãy: x0 , x1, ..., xn-1, xn . d 5
3 h
Trong đó u= x0 , v= xn , (xi , xi+1)  E e
Hay theo các cung: (x0 , x1 ), (x1, x2 ), 6
(1, 2, 6, 4, 3)
..., (xn-1, xn ). (a, c, f, d)
10/6/2023
(1, 3, 4, 5, 6) 31
6.3. Đường đi, chu trình, đồ thị liên thông (5)
 Đồ thị vô hướng G=(V,E) được gọi là liên thông
Không nếutựluôn tìm
có thứ
được đường đi giữa 2 đỉnh bất kỳ của nó.

Đường đi: 1, 3, 2, 4, 5

10/6/2023 32
6.3. Đường đi, chu trình, đồ thị liên thông (6)
 Đồ thị H=(W,F) được gọi là đồ thị con của đồ thị
Không G=(V,E)
có thứ tự nếu: W
 V và F  E.
 Nếu W =V (số đỉnh giống nhau), thì H gọi là đồ thị bộ phận của G.

V={1, 2, 3, 4, 5}
10/6/2023 E={a, b, c, d, e} 33
6.3. Đường đi, chu trình, đồ thị liên thông (7)
 Bài tập Không có thứ tự
Đồ thị K3 có bao nhiêu đồ thị con có ít nhất một đỉnh ?

10/6/2023 34
6.3. Đường đi, chu trình, đồ thị liên thông (8)
▪ Một đồ thị không liên thông sẽ được phân
Khôngrãcó
thành các
thứ tự
thành phần liên thông, và mỗi thành phần liên thông này là
một đồ thị con liên thông của đồ thị ban đầu.

10/6/2023 35
6.3. Đường đi, chu trình, đồ thị liên thông (9)
• Đỉnh v được gọi là đỉnh rẽ nhánh nếu việccóloại
Không bỏ v cùng
thứ tự
các cạnh liên thuộc với nó sẽ làm tăng số thành phần liên
thông của đồ thị
• Cạnh e được gọi là cầu nếu việc loại bỏ nó sẽ làm tăng số
thành phần liên thông của đồ thị
2
1
Các đỉnh rẽ nhánh?
G 5 Các cạnh là cầu ?
3
10/6/2023 4 36
36
6.3. Đường đi, chu trình, đồ thị liên thông (10)
• Đồ thị có hướng G=(V,E) được gọi là Không có thứmạnh
liên thông tự nếu
luôn tìm được đường đi từ 1 đỉnh bất kỳ đến một đỉnh bất
kỳ khác của nó.
• Đồ thị có hướng G=(V,E) được gọi là liên thông yếu
nếu đồ thị vô hướng tương ứng với nó là đồ thị vô
hướng liên thông.
• Đồ thị có hướng liên thông một phần: nếu 2 đỉnh bất kỳ u
và v, hoặc là tồn tại đường đi từ u đến v, hoặc là tồn tại
đường đi từ v đến u
10/6/2023 37
6.3. Đường đi, chu trình, đồ thị liên thông (11)
Đồ thị có hướng nào sau là liên thông mạnh,
Khôngliên
có thông
thứ tự
yếu và liên thông một phần ?

2
1
1

G 2
5 H 5
3
3 4
4
10/6/2023 38
6.3. Đường đi, chu trình, đồ thị liên thông (12)
▪ Bài tập Không có thứ tự

1. Trong 1 đồ thị vô hướng G có chứa đúng 2 đỉnh bậc lẻ (các


đỉnh còn lại nếu có đều bậc chẵn). CM có 1 đường đi nối 2
đỉnh bậc lẻ đó với nhau.

10/6/2023 39
6.4. Các cách biểu diễn đồ thị (1)

Các cách biểu diễn đồ thị

Ma trận kề Danh sách cạnh Danh sách kề Ma trận liên thuộc

Ma trận trọng số Danh sách cung

10/6/2023 40
6.4. Các cách biểu diễn đồ thị (2)
▪ Ma trận kề (đơn đồ thị vô hướng) 2
 Định nghĩa 3
0
Đơn đồ thị vô hướng G = (V,E)
với tập đỉnh V = {0,…, n-1}, 4
1
tập cạnh E = {e0, e1,.., em-1}.
0 1 2 3 4
Ta gọi ma trận kề của G là 0 0 1 1 0 1
Ma trận
A = {ai,j , i,j = 0,…, n-1}, với: 1 1 0 1 0 1
kề là
2 1 1 0 0 0
3 0 0 0 0 0 đối xứng
0 𝑛ế𝑢 𝑖, 𝑗 ∉ 𝐸
𝑎𝑖,𝑗 =ቊ 4 1 1 0 0 0
1 𝑛ế𝑢 𝑖, 𝑗 ∈ 𝐸
10/6/2023 41
6.4. Các cách biểu diễn đồ thị (3)
▪ Ma trận kề (đơn đồ thị có hướng) 2
 Định nghĩa 3
0
Đơn đồ thị có hướng G = (V,E)
với tập đỉnh V = {0,…, n-1}, 4
1
tập cung E = {e0, e1,.., em-1}. 0 1 2 3 4
Ta gọi ma trận kề của G là 0 0 0 1 0 1
Ma trận kề
1 1 0 0 0 0
A = {ai,j , i,j = 0,…, n-1}, với: là không
2 0 1 0 1 0 đối xứng
0 𝑛ế𝑢 𝑖, 𝑗 ∉ 𝐸 3 0 0 0 0 1
𝑎𝑖,𝑗 =ቊ
1 𝑛ế𝑢 𝑖, 𝑗 ∈ 𝐸 4 0 1 0 0 0
10/6/2023 42
6.4. Các cách biểu diễn đồ thị (4)
▪ Ma trận kề (đa đồ thị có hướng/vô hướng) 2
 Định nghĩa
0 3
Đa đồ thị có hướng/vô hướng
G = (V,E) với tập đỉnh V={0,…, n-1}, 4
1
tập cung/cạnh E = {e0, e1,.., em-1}. 0 1 2 3 4
Ta gọi ma trận kề của G là 0 0 0 1 0 1
A = {ai,j , i,j = 0,…, n-1}, với: 1 1 0 0 0 0
2 0 1 0 2 0
ai,j = số cung/cạnh nối từ
3 0 0 0 0 1
đỉnh i đến đỉnh j. 4 0 1 0 0
10/6/2023
1 43
6.4. Các cách biểu diễn đồ thị (5)
▪ Một số tính chất của ma trận kề
 Ma trận kề của đồ thị vô hướng là đối xứng
a[i,j] = a[j,i]. Ngược lại, ma trận đối xứng (0,1), có đường
chéo chính bằng 0, bậc n sẽ tương ứng với đơn đồ thị vô
hướng n đỉnh.
 Nếu đồ thị vô hướng: Ưu điểm và
Tổng dòng thứ i = Tổng cột thứ i hạn chế của
ma trận kề?
= deg(i)
 Nếu đồ thị có hướng:
Tổng dòng i = deg+(i), Tổng cột i = deg -(i)
10/6/2023 44
6.4. Các cách biểu diễn đồ thị (6)
0
#define MAX_NODES 100
1
2 // Cấu trúc đại diện cho một cạnh
typedef struct Edge {
33 int from;
0 1 2 3
int to;
} Edge;
0 0 1 1 0

1 0 0 1 1

2 0 0 0 1

3 0 0 1 0
10/6/2023 45
6.4. Các cách biểu diễn đồ thị (7)
// Cấu trúc đại diện cho đồ thị bằng ma trận kề
typedef struct Graph {
int numNodes;
int adjacencyMatrix[MAX_NODES][MAX_NODES];
} Graph;
// Hàm để thêm một cạnh vào đồ thị
void addEdge(Graph &graph, int from, int to) {
// Đánh dấu có cạnh nối
graph.adjacencyMatrix[from][to] = 1;
}
// Hàm để in ma trận kề
void printGraph(Graph &graph) {
printf("Ma trận kề:\n");
// Dùng 2 vòng lặp để xuất adjacencyMatrix
}
10/6/2023 46
6.4. Các cách biểu diễn đồ thị (8)
int main(){
Graph graph; graph.numNodes = 4;
// Khởi tạo ma trận kề ban đầu với 0
for (int i = 0; i < graph.numNodes; i++)
for (int j = 0; j < graph.numNodes; j++)
graph.adjacencyMatrix[i][j] = 0;
// Thêm các cạnh vào đồ thị
addEdge(graph, 0, 1); addEdge(graph, 0, 2);
addEdge(graph, 1, 2); addEdge(graph, 1, 3);
addEdge(graph, 2, 3); addEdge(graph, 3, 2);
// In ma trận kề
printGraph(graph); return 0; } // hết main()
10/6/2023 47
6.4. Các cách biểu diễn đồ thị (9)
▪ Ma trận trọng số (đơn đồ thị)
 Đơn đồ thị G = (V,E)
Với tập đỉnh V = {0,…,n-1},
tập cạnh/cung E = {e0,e1,…em-1}.
Ta gọi ma trận trọng số của G là 0 1 2 3 4 5
A = {ai,j , i,j = 0,…,n-1}, với: 0 0 4 3 0 7 0
𝟎 𝒉𝒂𝒚 𝑪𝒌 𝒏ế𝒖 𝒊, 𝒋 ∉ 𝑬 1 4 0 5 0 3 0
𝒂𝒊,𝒋 = ቊ
𝒕𝒓ọ𝒏𝒈 𝒔ố 𝒄ạ𝒏𝒉/𝒄𝒖𝒏𝒈 (𝒊, 𝒋) 𝒏ế𝒖 𝒊, 𝒋 ∈ 𝑬 2 3 5 0 2 0 0
Ck là một giá trị nào đó được quy định 3 0 0 2 0 5 2
trước là 1 trong các giá trị (0, -1, , -, ..) 4 7 3 0 5 0 3
10/6/2023 5 0 0 0 2 3
48 0
6.4. Các cách biểu diễn đồ thị (10)
▪ Ma trận trọng số (đơn đồ thị)
0 1 #define MAX_NODES 100
5
4 11 8 // Cấu trúc đại diện cho một cạnh
typedef struct Edge {
3 2 int from;
15
int to;
0 1 2 3
int weight; //Thêm trọng số
0 0 5 0 4
1 5 0 8 0 } Edge;
2 11 0 0 15 ...
10/6/20233 0 0 0 0 49
6.4. Các cách biểu diễn đồ thị (11)
▪ Ma trận trọng số (đơn đồ thị)
// Hàm để thêm một cạnh vào đồ thị (có trọng số)
void addEdge(Graph &graph, int from, int to, int weight) { //
Đánh dấu có cạnh nối
graph.adjacencyMatrix[from][to] = weight;
}
int main() {
Graph graph; graph.numNodes = 4;
// Thêm các cạnh vào đồ thị (có trọng số)
addEdge(graph, 0, 1, 5); addEdge(graph, 0, 3, 4);
addEdge(graph, 1, 0, 5); addEdge(graph, 1, 2, 8);
addEdge(graph, 2, 0, 11);addEdge(graph, 2, 3, 15);
// In ma trận kề
printGraph(graph); return 0; } // hết hàm main()
10/6/2023 50
6.4. Các cách biểu diễn đồ thị (12)
Ma trận liên thuộc đỉnh-cạnh
▪ Định nghĩa (Đồ thị vô hướng)
Đồ thị vô hướng G=(V, E).
Tập đỉnh V={0, 1, 2, …, n- 1)}.
Tập cạnh E={e0, e1, …, em-1 }.
Ta gọi ma trận liên thuộc của G là
B = {bi, j, i = 0,..,n-1, j = 0, .. m-1}. 0 1 2 3 4 5 6 7 8
0 1 0 0 0 0 1 1 0 0
Trong đó 1 0 0 0 0 1 1 0 1 0
• bi,j = 1 nếu đỉnh i kề cạnh j 2 1 1 0 1 0 0 0 1 0
• bi, j = 0 nếu đỉnh i không kề cạnh j 3 0 1 1 0 0 0 0 0 1
10/6/2023
4 0 0 1 0 1 0 1 0
51
1
6.4. Các cách biểu diễn đồ thị (13)
Ma trận liên thuộc đỉnh-cạnh
▪ Tính chất
Mỗi cột chứa đúng hai số 1 chỉ
hai đầu của cạnh tương ứng với
đỉnh ứng với cột đó. Cột ứng với
khuyên chứa đúng một số 1.
0 1 2 3 4 5 6 7 8
Các cột ứng với các cạnh lặp thì 0 1 0 0 0 0 1 1 0 0
giống nhau. 1 0 0 0 0 1 1 0 1 0
Nếu đồ thị không có khuyên thì 2 1 1 0 1 0 0 0 1 0
tổng hàng i là bậc của đỉnh . 3 0 1 1 0 0 0 0 0 1
10/6/2023 4 0 0 1 0 1 0 1 0
52 1
6.4. Các cách biểu diễn đồ thị (14)
Ma trận liên thuộc đỉnh-cạnh
▪ Định nghĩa (Đơn đồ thị có hướng)
Đơn đồ thị có hướng G=(V, E).
Tập đỉnh V={0, 1, 2, …, n-1)}. Tập cung E={e0, e1, …, em-1 }.
Ta gọi ma trận liên thuộc của G là
B = {bi, j, i = 0,..,n-1, j = 0, .. m-1}. Trong đó
• bi,j = 1 nếu đỉnh i là đỉnh đầu của cung j
• bi,j = -1 nếu đỉnh i là đỉnh cuối của cung j
• bi, j = 0 nếu đỉnh i không là đầu mút của cung j
10/6/2023 53
6.4. Các cách biểu diễn đồ thị (15)
Ma trận liên thuộc đỉnh-cạnh
(1,2) (4,1) (1,3) (3,4) (2,4)
1 1 -1 1 0 0
2 -1 0 0 0 1
3 0 0 -1 1 0
4 0 1 0 -1 -1

10/6/2023 54
6.4. Các cách biểu diễn đồ thị (16)
Danh sách cạnh
 Đối với các đồ thị thưa Cạnh Đầu 1 Đầu 2
(n đỉnh, m cạnh (m < 6n) người ta thường e0 0 2
dùng cách biểu diễn danh sách cạnh để tiết e1 0 1
kiệm không gian lưu trữ. e5 e2 0 4
 Lưu các cạnh 2 3 e3 1 2
e0 e7
e=(u, v) của đồ thị e3 e4 1 4
trong một danh sách 0 e6 e5 2 3
5
 Danh sách có thể e1 e2 e8 e6 3 4
được cài đặt bằng e7 3 5
mảng 1 chiều hoặc 1 e4 4 e8 4 5
danh sách liên kết.
10/6/2023 55
6.4. Các cách biểu diễn đồ thị (17)
Danh sách cạnh
Cạnh Đầu 1 Đầu 2
▪ Cài đặt bằng mảng 1 chiều
0 0 2
1 0 1
2 0 4
3 1 2
▪ Cài đặt bằng danh sách liên kết
4 1 4
5 2 3
6 3 4
typedef struct Edge 7 3 5
{ int from, to; 8 4 5
} Edge;
10/6/2023 56
6.4. Các cách biểu diễn đồ thị (18)
Danh sách cung
 Trong trường hợp đồ thị có hướng thì mỗi phần tử của danh
sách (gọi là danh sách cung) là một cung e=(u, v). Trong đó u
là đỉnh đầu, v là đỉnh cuối của cung. Cung Đầu Cuối
(1,2) 1 2
(4,1) 4 1
(1,3) 1 3
(2,4) 2 4
(3,4) 3 4
10/6/2023 57
6.4. Các cách biểu diễn đồ thị (19)
Danh sách cạnh/cung
5
0 1
// Cấu trúc đại diện cho một cạnh
11 typedef struct Edge {
4 8 int from;
int to;
3 2
15 int weight; // Trọng số (nếu có)
0 1 2 3 } Edge;
0 0 5 0 4
1 5 0 8 0
2 11 0 0 15

3 0 0 0 0
10/6/2023 58
6.4. Các cách biểu diễn đồ thị (20)
Danh sách cạnh/cung
// Hàm để in danh sách cạnh (có hoặc không có trọng số)
void printEdges(Edge *edges, int numEdges) {
printf("Danh sách cạnh:\n");
for (int i = 0; i < numEdges; i++)
if (edges[i].weight != -1) //Có trọng số
printf("(%d, %d, %d)\n", edges[i].from, edges[i].to, edges[i].weight);
else
printf("(%d, %d)\n", edges[i].from, edges[i].to); } hết printEdges
int main() {
int numEdges = 6;
Edge edges[] = {{0, 1, 5}, {0, 3, 4}, {1, 0, 5},
{1, 2, 8}, {2, 0, 11}, {2, 3, 15}};
// In danh sách cạnh (với hoặc không có trọng số)
printEdges(edges, numEdges); return 0; } // hết hàm main()
10/6/2023 59
6.4. Các cách biểu diễn đồ thị (21)
Danh sách kề Đỉnh V Các đỉnh kề
 Tương ứng với mỗi đỉnh v của đồ thị, 0 1, 2, 4
ta có tương ứng một danh sách để lưu 1 0, 2, 4
các đỉnh kề với nó. 2 0, 1, 3
 Danh sách: mảng 1 chiều, hoặc danh 3 2, 4, 5
sách liên kết 4 0, 1, 3, 5
5 3, 4
Cài đặt bằng mảng:
Ke[] = {1, 2, 4, 0, 2, 4, 0, 1,
3, 2, 4, 5, 0, 1, 3, 5, 3, 4 }
10/6/2023
ViTri[] = {0, 3, 6, 9, 12,
60
16}
6.4. Các cách biểu diễn đồ thị (22)
▪ Cài đặt bằng danh sách kề liên kết
Đỉnh V Các đỉnh kề
0 1, 2, 4
1 0, 2, 4
2 0, 1, 3
3 2, 4, 5
4 0, 1, 3, 5
5 3, 4
• L(0) = {1, 2, 4} L(1) = {0, 2, 4}
• Mỗi đỉnh u duy trì một danh sách các • L(2) = {0, 1, 3} L(3) = {2, 4, 5}
đỉnh kề với u, ký hiệu L(u) • L(4) = {0, 1, 3, 5} L(5) = {3,61 4}
10/6/2023
6.4. Các cách biểu diễn đồ thị (23)
Danh sách kề
Đỉnh V Các cạnh kề
0 1, 2, 4
1 0, 2, 4
2 0, 1, 3
3 2, 4, 5
4 0, 1, 3, 5
5 3, 4

10/6/2023 62
6.4. Các cách biểu diễn đồ thị (24)
Danh sách kề
Đỉnh V Các cạnh kề
0 1, 2, 4
1 0, 2, 4
2 0, 1, 3
3 2, 4, 5
4 0, 1, 3, 5
5 3, 4

10/6/2023 63
6.4. Các cách biểu diễn đồ thị (25)
▪ Cài đặt bằng danh sách kề liên kết
#include <stdio.h>
#include <stdlib.h>
//Định nghĩa các cấu trúc cho danh sách kề
struct Node
{ int vertex;
struct Node *next;
};
struct Graph
{ int numVertices; // Số đỉnh
struct Node **lists;
};
10/6/2023 64
6.4. Các cách biểu diễn đồ thị (26)
// Tạo mới 1 Node
struct Node *createNode(int val)
{ // cấp phát bộ nhớ
struct Node *newNode = malloc(sizeof(struct Node));
// gán mã đỉnh
newNode->vertex = val;
// cho next cho tới NULL
newNode->next = NULL;
return newNode;
}
10/6/2023 65
6.4. Các cách biểu diễn đồ thị (27)
// Tạo kết nối giữa 2 đỉnh
void addEdge(struct Graph *graph, int s, int d)
{ // Thêm kết nối từ s đến d; tạo node mới
struct Node *newNode = createNode(d);
// Node mới ta sẽ chèn vào đầu danh sách liên kết cho nhanh. Vì
// chèn vào cuối phải duyệt tới cuối.Cho node mới làm head ủa DSLK,
// nên cần cho next của nó trỏ tới next mà head hiện tại đang trỏ
newNode->next = graph->lists[s]->next;
// Cập nhật head mới cho DSLK
graph->lists[s]->next = newNode;
// Kết thúc thêm kết nối từ s đến d; Thêm kết nối từ d đến s
// Quá trình tương tự như trên
newNode = createNode(s);
newNode->next = graph->lists[d]->next;
graph->lists[d]->next
10/6/2023 = newNode; } //hết hàm void addEdge(..)66
6.4. Các cách biểu diễn đồ thị (28)
// Hàm in danh sách kề
void printGraph(struct Graph *graph){
int i;
// Duyệt qua từng danh sách liên kết
for (i = 0; i < graph->numVertices; i++) {
//Tại mỗi danh sách liên kết, tạo con trỏ làm biến tạm để duyệt
// Nếu dùng luôn head để duyệt sẽ mất dấu head của DSLK
printf("Dinh %d co ket noi voi: ", graph->lists[i]->vertex);
struct Node *temp = graph->lists[i]->next;
// duyệt dslk cho tới khi null
while (temp){
printf("%d ", temp->vertex); temp = temp->next;
}
printf("\n"); } // hết for(..)
} // 10/6/2023
hết hàm void printGraph(..) 67
6.4. Các cách biểu diễn đồ thị (29)
int main() {
struct Graph *graph = createAGraph(4);
addEdge(graph, 0, 1);
addEdge(graph, 0, 2);
addEdge(graph, 0, 3);
addEdge(graph, 1, 2);
printGraph(graph);
return 0;
}

10/6/2023 68
6.4. Các cách biểu diễn đồ thị (30)
❑ n2 Đơn vị bộ nhớ
Các cách biểu diễn đồ thị ❑ Dễ kiểm tra đ/k kề nhau

❑ 2m Đơn vị bộ nhớ
Ma trận kề ❑ Đồ thị thưa
❑ Khó kiểm tra đ/k kề nhau
▪Tổng kết Danh sách cạnh ❑ 2m+n Đơn vị bộ nhớ
❑ Dễ dàng thêm bớt danh
Danh sách kề sách các cạnh và đỉnh
❑ m.n Đơn vị bộ nhớ
Ma trận liên thuộc ❑ Dễ dàng thêm bớt danh
sách các cạnh và đỉnh
10/6/2023 69
6.5. Bài Tập
Cài đặt các hàm:

1. Nhập 1 đồ thị vô hướng có trọng số

2. Nhập 1 đồ thị có hướng có trong số

3. Đọc dữ liệu đồ thị từ file text

4. Kiểm tra xem đồ thị có hướng hay vô hướng?

10/6/2023 70

You might also like