Thông tin tài liệu
ðồ thị (Graph)(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ị (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 ð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 ð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 Sắp xếp topo Cho ñồ thị có hướng nhưng không có chu trình G = (V, E) (Directed acylic graph / DAG) Sắp xếp các ñỉnh của ñồ thị G thành một danh sách sao cho nếu có cung (u,v) ∈ E, thì đỉnh u uu u phải đứng trước đỉnh v vv v . G A B C F E D Sắp xếp topo TopoSort (u) { ðánh dấu u ñã thăm; for (mỗi ñỉnh v kề u) if ( v chưa thăm) TopoSort(v); Xen u vào ñầu danh sách T; } //Sắp xếp các ñỉnh của ñồ thị ñịnh hướng //không có chu trình G =(V,E) thành danh sách topo. TopoSortGraph(G) { for (mỗi ñỉnh u ∈ V) ðánh dấu u chưa ñược thăm; Khởi tạo danh sách topo T rỗng; for (mỗi ñỉnh u ∈ V) if (u chưa thăm) TopoSort (u); } ðường ñi giữa hai ñiểm Cho ñồ thị G = (V, E) Giữa hai ñỉnh (x 0 , x k ) có ñường ñi, nếu tồn tại (x 1 ,…,x k-1 ) thỏa mãn (x i , x i+1 ) ∈ E, ∀i = 0…(k-1) ðồ thị liên thông (Connected graph) Cho ñồ thị G = (V, E), G ñược gọi là liên thông nếu tồn tại ñường ñi giữa hai ñỉnh bất kì của ñồ thị Tìm tất cả các thành phần liên thông Cho ñồ thị G = (V, E), tìm tất cả các thành phần liên thông của ñồ thị. ðỉnh i của ñồ thị ñược gán nhãn c i cho biết thuộc miền liên thông c i . Tìm các thành phần liên thông //ði qua ñồ thị theo bề rộng xuất phát từ v FindConnectedComponent (v, ci) { (1) Khởi tạo hàng ñợi Q rỗng; (2) Xen v vào hàng ñợi Q; (3) ðánh dấu ñỉnh v ñã ñược thăm, và gán nhãn v bằng ci (4) while (hàng ñợi Q không rỗng) { (5) Lấy ñỉnh w ở ñầu hàng ñợi Q;(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) { (8) Xen u vào ñuôi hàng ñợi Q; (9) ðánh dấu u ñã ñược thăm, và gán nhãn u bằng ci } (10) Loại w ra khỏi hàng ñợi Q } // hết vòng lặp while. } [...]...Tìm các thành ph n liên thông // Tìm các thành ph n liên thông c a ñ th G=(V, E) FindAllConnectedComponent (G) { (10 ) for (m i v ∈V) (11 ) ðánh d u v chưa ñư c thăm; (12 ) ci = 0; (13 ) for (m i v ∈V) (14 ) if (v chưa ñư c thăm) { (15 ) FindConnectedComponent(v, ci); (16 ) ci = ci + 1 } } ðư ng ñi ng n nh t Cho ñ th G=(V, E), c nh (u, v) ∈ E có ñ dài weight (u,v) > 0 Tìm ñư ng ñi ng n nh t t ñ nh s ñ... t i bư c i tìm ñ nh u ∈ unknown có kho ng cách nh nh t if u = e then k t thúc else { known = known ∪ {u} unknown = unknown – {u} Dùng u ñ s a nhãn cho các ñ nh thu c t p unknown ti n hành bư c th (i + 1) } Dijkstra Algorithm { Known = {s}; Unknown = {E} – {s} for v ∈ unknown { dist[v] = weight [s, v]; pre[v] = s; } u = s; // at the first step while (u != e ){ ch n u sao cho dist[u] = min {dist[x] | . ñiểm Cho ñồ thị G = (V, E) Giữa hai ñỉnh (x 0 , x k ) có ñường ñi, nếu tồn tại (x 1 ,…,x k -1 ) thỏa mãn (x i , x i +1 ) ∈ E, ∀i = 0…(k -1 ) ðồ thị liên thông. (10 ) for (mỗi v ∈V) (11 ) ðánh dấu v chưa ñược thăm; (12 ) ci = 0; (13 ) for (mỗi v ∈V) (14 ) if (v chưa ñược thăm) { (15 ) FindConnectedComponent(v, ci); (16 )
Ngày đăng: 06/11/2013, 01:15
Xem thêm: Đồ thị - 1