Professional Documents
Culture Documents
Đồ 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.
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
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.
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
5 4 3
E D C
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 .
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