ðồ thị Graph Lê Sỹ Vinh Bộ môn Khoa Học Máy Tính – Khoa CNTT ðại Học Công Nghệ - ðHQGHN Email: vinhioi@yahoo.com... ðồ thị có trọng số và không có trọng sốweighted and unweighted graph G
Trang 1ðồ thị (Graph)
Lê Sỹ Vinh
Bộ môn Khoa Học Máy Tính – Khoa CNTT
ðại Học Công Nghệ - ðHQGHN
Email: vinhioi@yahoo.com
Trang 5Đồ thị (graph)
• G = (V, E)
– V: Tập ñỉnh
– E = { (u,v) | u, v ∈ V}: Tập cạnh
Ví dụ: Biểu diễn bản ñồ ñường ñi trong thành phố bằng ñồ thị G = (V, E)
– V: Tập hợp các ñiểm trong thành phố
– E: Tập hợp các ñường ñi trong thành phố, mỗi ñường ñi nối hai ñiểm
Trang 6ðồ thị có hướng và không có hướng
(directed and undirected graph)
G = (V, E) là ñồ thị không có hướng nếu (u, v) ∈ E thì (v, u) ∈ E
Trang 7ðồ thị có trọng số và không có trọng số
(weighted and unweighted graph)
G = (V, E) là ñồ thị có trọng số nếu mỗi cạnh (u, v) ∈ E ñược gán một giá trị
Trang 8ðồ thị có chu trình và không chu trình
(cyclic and acyclic graph)
Trang 9ðồ thị không có nhãn và ñồ thị có nhãn
(unlabled and labled graph)
Trang 10Friend graph
Trang 11Bậc của ñỉnh (vertex degree)
Trang 12Biểu diễn ñồ thị
G = (V, E); V = {0, 1,…, n-1}
• Biểu diễn bằng danh sách liền kề A
– A[u][v] = 1 nếu có cung (u,v)
– A[u][v] = 0 nếu không có cung (u,v)
Trang 13Biểu diễn ñồ thị
G = (V, E); V = {0, 1,…, n-1}
• Biểu diễn bằng danh sách kề
Trang 14ði qua ñồ thị
• ði qua tất cả các ñỉnh, mỗi ñỉnh một lần
0, 1, 2, 3, 4
• ði qua tất cả các cạnh, mỗi cạnh một lần
(0,1), (0, 2), (1, 2), (1, 4),
(2, 3), (2, 4), (4, 3), (3, 0)
Trang 15ði qua ñồ thị theo chiều rộng
(Breadth first search)
• ði qua tất cả các ñỉnh của ñồ thị, mỗi ñỉnh ñúng một lần
• Bắt ñầu xuất phát từ một ñỉnh s, lần lượt thăm các ñỉnh liền kề với s Tiếp
tục quá trình thăm các ñỉnh theo nguyên tắc: ðỉnh nào ñược thăm trước thì các ñỉnh liền kề với ñỉnh ñó sẽ ñược thăm trước
• Xem ví dụ
http://www.cs.princeton.edu/~wayne/cs423/lectures.html
Trang 16đi qua ựồ thị theo chiều rộng
(Breadth first search)
//đi qua ựồ thị theo bề rộng xuất phát từ v
BreadthFirstSearch (v) {
(1) Khởi tạo hàng ựợi Q rỗng;
(3) Xen v vào hàng ựợi Q;
(2) đánh dấu ựỉnh v ựã ựược thăm;
(4) while (hàng ựợi Q không rỗng) {
(5) Lấy ựỉnh w ở ựầu hàng ựợi Q;
(6) for (mỗi ựỉnh u kề w)
(7) if ( u chưa ựược thăm) {
} (10) Loại w ra khỏi hàng ựợi Q
} // hết vòng lặp while.
}
Trang 17đi qua ựồ thị theo chiều rộng
(Breadth first search)
// đi qua ựồ thị G=(V, E) theo bề rộng
BreadthFirstSearch_traversal (G) {
(10) for (mỗi v ∈V)
(11) đánh dấu v chưa ựược thăm;
(12) for (mỗi v ∈V)
(13) if (v chưa ựược thăm)
(14) BreadthFirstSearch(v);
}
Trang 18ði qua ñồ thị theo chiều sâu
(Depth first search)
//ði qua ñồ thị theo chiều sâu xuất phát từ v
DepthFirstSearch (v) {
for (mỗi ñỉnh u kề với v)
if (u chưa ñược thăm) {
thăm u và ñánh dấu u ñã ñược thăm DepthFirstSearch (u)
} }
Xem ví dụ
http://www.cs.princeton.edu/~wayne/cs423/lectures.html
Trang 19đi qua ựồ thị theo chiều rộng
(Depth first search)
// đi qua ựồ thị G=(V, E) theo chiều sâu
DepthFirstSearch_traversal (G) {
(10) for (mỗi v ∈V)
(11) đánh dấu v chưa ựược thăm;
(12) for (mỗi v ∈V)
(13) if (v chưa ựược thăm)
(14) DepthFirstSearch(v);
}