You are on page 1of 9

CHƯƠNG 6

CẤU TRÚC DỮ LIỆU KIỂU ĐỒ THỊ (GRAPH)

6.1 ĐỒ THỊ CÓ HƯỚNG


6.1.1 KHÁI NIỆM
Đồ thị có hướng (Directed graph) gồm một tập hợp hữu hạn các
phần tử gọi là nút hay đỉnh, cùng với một tập hợp hữu hạn các cạnh có
hướng nối các cặp đỉnh với nhau .

Chẳng hạn cho đồ thị sau đây:

Đồ thị này gồm 5 nút được đánh số 1,2,3,4,5 và 7 cạnh nối các nút từ
1 đến 2, 1 đến 4, 1 đến 5, 2 đến 4, 3 đến chính nó, 4 đến 2, và 4 đến 3.
Cây có thể coi là trường hợp đặc biệt của đồ thị có hướng và được
đặc trưng bởi tính chất là một trong các nút, nút gốc, không có cạnh nào
hướng đến nó, và tất cả các nút còn lại có thể đạt đến từ nút gốc bằng một
đường duy nhất. Nghĩa là, chỉ đi theo một và chỉ một dãy các cạnh liên tiếp.
Đồ thị trên đây có một nút "gần giống như nút gốc"
(Không có cạnh nào hướng đến nó) là nút 1, nhưng có nhiều đường khác
nhau từ nút 1 đến nút 3.
Ví dụ:
1 2 3
1 4 3
1 4 2 3
..........
Đồ thị có rất nhiều ứng dụng trong thực tiễn. Đồ thị có hướng
được dùng để thiết kế, phân tích các sơ đồ mạng điện, biểu diễn đường găng
trình tự thực hiện các hạng mục trong một công trình xây dựng.
Ví dụ: Đồ thị có hướng biểu diễn quá trình lập kế hoạch SX trong 1 DN.
1
3.1

1 2 3 3.2 4 5

3.3
1 § Æt môc tiª u kÕho¹ ch
2 Nghiª n cøu thÞtr­ êng
3 § ¸ nh gi¸ c¸ c tiÒm n¨ ng cña danh nghiÖp
3.1 Lao ®éng
3.2 Kh¶ n¨ ng tµi chÝ nh
3.3 N¨ ng lùc s¶n xuÊt
4 X©y dùng c¸ c chØtiª u kÕho¹ ch
5 Thùc hiÖn kÕho¹ ch

Trong sơ đồ này mỗi hình chữ nhật biểu diễn một công đoạn trong
qui trình lập kế hoạch, bắt đầu từ công đoạn tiền kế hoạch là nghiên cứu thị
trường đến công đoạn cuối cùng là thực hiện kế hoạch.

6.1.2 PHƯƠNG PHÁP CÀI ĐẶT ĐỒ THỊ CÓ HƯỚNG


Một phương pháp rất thông dụng để cài đặt đồ thị là sử dụng ma trận
kề (Adjacency matrix). Để xây dựng ma trận kề, trước hết chúng ta đánh số
các nút của đồ thị có hướng 1,2,2 ... n. Ma trận kề là ma trận Adj bậc n x n
trong đó thành phần ở hàng i, cột j có giá trị 1 nếu có một cạnh từ i đến j, và
có giá trị o nếu khác.
Ví dụ : Cho đồ thị có hướng sau đây:
1 5
A
E

2 3 4
B C D

Ta có ma trận kề :

2
0 1 1 0 1

0 0 1 0 0

Adj = 0 0 0 1 0

0 0 0 1 0

Để xác định các giá trị A,B,C ... của các nút chúng ta sử dụng thêm một ma
trận Data chỉ gồm một cột chứa các giá trị này , trong đó dữ liệu của nút thứ
i được lưu trữ tại Data[i]. Như vậy chúng ta có hai mảng :

0 1 1 0 1

0 0 1 0 0

Adj = 0 0 0 1 0

0 0 0 1 0

A
B
Data = C
D
E

Thông thưòng trong ma trận kề có chứa rất nhiều phần tử bằng không,
do đó sẽ tốn rất nhiều không gian nhớ để lưu trữ các phần tử này. Có thể sử
dụng phương pháp lưu trữ ma trận kề bằng DSLK theo hàng (Linked Row
List) chúng ta sẽ có cách biểu diễn danh sách kề cho một đồ thị có hướng.
Cho đồ thị có hướng sau đây:

3
1
A 5
E

2 3 4
B C D

Danh sách kề của đồ thị này như sau:


Nót ®Çu Nót dØnh
V[1] A 2 3 5

V[2]
B 3

V[3] C 2 4

V[4] D 4

V[5]
E

Một đồ thị có hướng được biểu diễn bởi một mảng các con trỏ
V[1],V[2], ...V[n], mỗi con trỏ cho mỗi nút trong đồ thị có hướng. Mỗi
phần tử mảng V[i] chỉ đến một nút đầu lưu trữ dữ liệu cho nút ấy và chứa
một con trỏ chỉ đến một danh sách liên kết của các nút kề (Nút được nối với
i theo hướng từ i đi ra). Mỗi nút kề có 2 trường: trường số nguyên, lưu trữ
dữ liệu của nút và trường liên kết chỉ đến nút tiếp theo trong danh sách kề
này.

6.1.3 CÁC GIẢI THUẬT XỬ LÝ DANH SÁCH KỀ


Giải thuật thiết lập danh sách kề
Giải thuật tìm theo chiều sâu
Để hiểu rõ bản chất của giải thuật tìm theo chiều sâu (Depth-First
Search) chúng ta xét đồ thị có hướng sau đây:

4
A

B C D

E F G

Trước hết chúng ta thăm gốc rồi chọn một trong các nút con của nó
chẳng hạn nút B và thăm nút này. Tuy nhiên, trước khi thăm các nút con
khác, chúng ta thăm các nút con của B theo chiều sâu. Chúng ta chọn một
trong các con của B chẳng hạn nút E và thăm nó: Ta có trình tự sau đây:
A,B,E
Ta tiếp tục thăm các nút con của E nhưng vì E không có các nút con
nên ta trở lại thăm các nút con của nút B . Ta thăm nút F và nút con của nó
là H. Ta có:
A,B,E,F,H
Như vậy, chúng ta đã xem xét xong nút B và các con cháu của nó.
Chúng ta trở lại nút A và tiếp tục thăm các nút con (C và D) của nó. Ta có
các trình tự sau đây:
A,B,E,F, H,C
A,B,E,F,H,C,D,G
Giải thuật tìm theo chiều rộng
A

B C D

E F G

Chúng ta xem xét việc quét đồ thị này theo chiều rộng. Trước hết chúng ta
bắt đầu từ gốc, thăm gốc và các con của nó, chẳng hạn từ phải sang trái:

5
A,B,C,D
Sau đó tiến hành thăm các con của các nút trong mức đầu tiên này:
A,B,C,D,E,F,G
và cuối cùng chúng ta thăm các nút con của các nút trong mức thứ hai:
A,B,C,D,E,F,G,H
Giải thuật quét đồ thị có hướng

6.2 ĐỒ THỊ VÔ HƯỚNG


6.2.1 KHÁI NIỆM
Đồ thị vô hướng gồm một tập hợp hữu hạn các phần tử gọi là nút hay
đỉnh cùng với 1 tập hợp hữu hạn các cạnh nối các cặp đỉnh với nhau.
Như vậy, đồ thị vô hướng khác với đồ thị có hướng ở chỗ các cạnh
không được định hướng và không có nút nào được nối với chính nó.
1 2
A
B

5 4 3

E D C

6.2.2 PHƯƠNG PHÁP CÀI ĐẶT ĐỒ THỊ VÔ HƯỚNG


Có 3 phương pháp cài đặt đồ thị vô hướng:
- Dùng ma trận kề
- Dùng danh sách kề
- Dùng danh sách các cạnh

Dùng ma trận kề
Cũng như đồ thị có hướng, chúng ta có thể biểu diễn đồ thị vô hướng bằng
ma trận kề. Chẳng hạn, ma trận kề của đồ thị ở trên biểu diễn như sau:

6
0 1 0 1 1

1 0 0 1 0

Adj = 0 0 0 1 0

1 1 1 0 1

1 0 0 1 0

trong đó số 1 trong hàng i cột J chỉ ra sự tồn tại của một cạnh nối các nút i
và J. Vì những cạnh này không có hướng, số 1 này cũng có mặt trong hàng
J cột i. Như vậy, ma trận kề của đồ thị vô hướng là một ma trận đối xứng .

Dùng danh sách kề


Nót ®Çu C¸ c nót kÒ
V[1] A 2 4 5

V[2]
B 1 4

V[3] C 4

V[4] D 1 2 3 5

V[5] E 1 4

Cách biểu diễn bằng danh sách kề đối với một dồ thị vô hướng cũng không
hiệu quả cho lắm vì phải lưu trữ các thông tin thừa. Nếu một cạnh nối các
nút i và J thì nút chứa i xuất hiện trong danh sách kề của nút i và nút chứa J
xuất hiện trong danh sách kề của nút I.
Dùng danh sách các cạnh
Một cách cài đặt hiệu quả hơn đồ thị vô hướng là dùng danh sách các cạnh.
Mỗi nút cạnh (Edge node) trong danh sách biểu diễn một cạnh trong đồ thị
và nó có dạng sau đây:

7
Vertex[1] Vertex[2]

Link[1] Link[2]

trong đó Vertex[1], Vertex[2] là các nút được nối bởi một cạnh , Link[1] chỉ
đến một cạnh khác có Vertex[1] như là một điểm cuối, và Link[2] chỉ đến
một cạnh khác có Vertex[2] như là một điểm cuối. Người ta dùng một mảng
V chứa các con trỏ chỉ đến các nút đầu lưu trữ các mục dữ liệu của các nút,
nút đầu được chỉ bởi V[i] cũng chứa một trường liên kết chỉ đến một nút
cạnh có nút thứ i là một trong các điểm cuối của nó.

Biểu diễn danh sách cạnh của đồ thị trên đây như sau:
1 e2 2
A
B

e3 e2 e6
5 4 3

E D C
e4 e5

trong đó chúng ta đã đánh dấu các cạnh trên hình vẽ có thể biểu diễn trong
hình vẽ sau đây.
Các giải thuật tìm theo chiều sâu, chiều rộng, giải thuật quét đồ thị, giải
thuật tìm đường ngắn nhất trong đồ thị cũng tương tự như đối với đồ thị có
hướng đã xét trong mục trước đây.
Đồ thị vô hướng có nhiều ứng dụng trong việc mô phỏng các sơ đồ mạng
điện, các hệ thống giao thông liên lạc vv.

8
C¸ c nót ®Çu C¸ c nót c¹ nh e1
1 2
V[1] A

V[2] 1 4 e2
B

e3 1 5
V[3] C

V[4] D e4 4 5

V[5] E

e5 3 4

e6 2 4

You might also like