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
Trang 1Chương 6 Cấu trúc dữ liệu kiểu Đồ thị ( Graph )
Trong chương 5 chúng ta đã nghiên cứumột loại cấu trúc phi tuyến là cây Cây là mộttrường hợp đặc biệt của một loại cấu trúc dữliệu tổng quát hơn ,đó là đồ thị( Graph) Trongchương này, chúng ta sẽ nghiên cứu hai loại đồthị là đồ thị có hướng và đồ thị vô hướng
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:
Trang 22, 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ínhchấ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ònlại có thể đạt đến từ nút gốc bằng một đường
Trang 3duy 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
Sau đây là một ví dụ khác về đồ thị: 1
2
6
5 4 3
Trang 4Trong trường hợp này ta có các đường đi nhưsau:
Ví dụ :
Đồ thị có hướng biểu diễn quá trình lập kếhoạch sản xuất trong một doanh nghiệp
Trang 5
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
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
Trang 6matrix) Để xây dựng ma trận kề ,trước hếtchúng ta đánh số các nút của đồ thị có hướng1,2,2 n Ma trận kề là ma trận Adj bậc n x ntrong đó thành phần ở hàng i, cột j có giá trị 1nếu có một cạnh từ i đến j ,và có giá trị o nếukhác
Ví dụ : Cho đồ thị có hướng sau đây:
Trang 70 1 1 0 1
0 0 1 0 0
Adj = 0 0 0 1 0
0 0 0 1 0
Trang 8Cho đồ thị có hướng sau đây:
Trang 9
1
A 5 E
Trang 10Một đồ thị có hướng được biểu diễnbở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 contrỏ 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ó hai trường : trường số nguyên,lưu trữ dữ liệu của nút và một trường liên kếtchỉ đến nút tiếp thẻo trong danh sách kề này Cách biểu diễn đồ thị có hướng bằngdanh sách kề có thể được cài đặt với các khaibáo như sau:
Const
MaxVertices= ( Số các nút của đồ thị cóhướng)
Trang 11V: ArrayOfPointer;
6.1.3 Các giải thuật xử lý danh sách kề
Để xây dựng các danh sách kề cho một đồ thị
có hướng chúng ta phải thực hiện các giải
thuật cơ bản xử lý danh sách kề
Giải thuật thiết lập danh sách kề
Gải thuật thiết lập danh sách kề được biểu diễnnhư sau:
Trang 12For i:= 1 to MaxVertices thực hiện các bướcsau đây:
1 - Lấy một nút đầu được chỉ bởi V[i] và khởiđộng trường Next của nó tại giá trị Nil
2 - Đọc dữ liệu trong nút này vào trường dữliệu V[i]^.Data của nút đầu
3 - Với mỗi nút kề với nút i ( Có hướng từ i đira) thực hiện các bước sau đây:
a Đọc số của nút ấy
b Chèn số này vào danh sách liên kếtcủa các nút kề được chỉ bởi V[i]^.Next bằngcách dùng một trong các giải thuật chèn trongdanh sách đã xét trong chương 5
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ìmtheo chiều sâu ( Depth- First Search) chúng taxét đồ thị có hướng sau đây:
Trang 13A,B,E
Ta tiếp tục thăm các nút con của Enhưng vì E không có các nút con nên ta trở lạithă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
Trang 14A,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
Trang 15(* Quét danh sách kề tìm theo chiều sâu*)
CurrPtr:= V[Start]^.Next;
While CurrPtr <> Nil do
Begin
NewStart := CurrPtr^.Vertex;
if ( NewStart in Unvisited) then
DepthFirstSeach (V ,Unvisited, NewStart);CurrPtr:= CurrPtr^.Next
end;
end;
Trong giải thuật này Unvisited là một tập hợp
có kiểu SetOfVertices= Set of VertexNumber
Nó có thể được khởi động bằng lệnh:
Unvisited:= [1 NumVertices] trước khi gọithủ tục DepthFirstSearch, trong đóNumVertices là số các nút trong đồ thị cóhướng
Giải thuật tìm theo chiều rộng
Xét đồ thị có hướng:
Trang 17Bước 1 Thăm nút xuất phát
Bước 2 Khởi động một Queue chỉ chứa nútxuất phát
Bước 3 While( Queue không rỗng) thực hiệncác bước sau đây:
b Thêm W vào hàng đợi
Giải thuật quét đồ thị có hướng
Giải thuật sau đây thực hiện việc quétmột đồ thị có hướng ,thăm mõi nút đúng mộtlần dựa trên cơ sở tìm kiếm theo chiều sâu:
1 Khởi động một tập hợp Unvisited chứa các
số của các nút trong đồ thị
2 While ( Unvisited khác rỗng) làm các bước
sau đây:
a Chọn một nút xuất phát từ tập Unvisited
Trang 18b Dùng giải thuật tìm theo chiều sâu để thămtất cả các nút có thể đạt được từ nút xuất phátnày
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 một 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 của nó khôngđược định hướng và không có một nút nàođược nối với chính nó
Trang 196.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ề
Trang 20Dù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ểudiễn như sau:
Dùng danh sách kề
Trang 21Bây giờ chúng ta dùng danh sách kề để biểu diễn đồ thị vô hướng trên đây:
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 khong 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ấ hiện trong danh sách kề của nút I
Trang 22Dù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útcạnh( Edge node) trong danh sách biểu diễnmột cạnh trong đồ thị và nó có dạng sau đây:
Trang 23kết chỉ đến một nút cạnh có nút thứ i là mộttrong các điểm cuối của nó
Biểu diễn danh sách cạnh của đồ thị trên đâynhư sau:
Đồ 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
Trang 25Câu hỏi và bài tập chương 6
Trang 28- Biểu diễn bằng danh sách kề
- Biểu diễn bằng danh sách cạnh
Trang 300 1 1 1
1 0 1 1
Adj = 1 1 0 1
1 1 1 0
Bài 6 Với các danh sách kề sau đây ,hãy vẽ các đồ thị tương ứng:
v[1] A 2 3
v[2] B 1
v[4] C 4 1
v[3] D 3