Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
597,85 KB
Nội dung
Đồ thị (Graph 2) Nguyễn Phương Thái Bộ môn Khoa Học Máy Tính – Khoa CNTT Đại Học Cơng Nghệ - ĐHQGHN Email: thainp@vnu.edu.vn Đồ 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 đồ đường thành phố đồ thị G = (V, E) – V: Tập hợp điểm thành phố – E: Tập hợp đường thành phố, đường nối hai điểm Đi qua đồ thị theo chiều rộng (Breadth first search) • Đi qua tất đỉnh đồ thị, đỉnh lần • Bắt đầu xuất phát từ đỉnh s, thăm đỉnh liền kề với s Tiếp tục trình thăm đỉnh theo nguyên tắc: Đỉnh thăm trước đỉnh liền kề với đỉnh 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 thăm) { thăm u đánh dấu u 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 khơng có chu trình G = (V, E) (Directed acylic graph / DAG) Sắp xếp đỉnh đồ thị G thành danh sách cho có cung (u,v) ∈ E, đỉnh u phải đứng trước đỉnh v GABCFED Sắp xếp topo TopoSort (u) { for (mỗi đỉnh v kề u) if ( v chưa thăm) TopoSort(v); Xen u vào đầu danh sách T; Đánh dấu u thăm; } //Sắp xếp đỉnh đồ 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 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 hai điểm Cho đồ thị G = (V, E) Giữa hai đỉnh (x0, xk) có đường đi, tồn (x1,…,xk-1 ) thỏa mãn (xi, xi+1) ∈ E, ∀i = 0…(k-1) Đồ thị liên thông (Connected graph) Cho đồ thị G = (V, E), G gọi liên thông tồn đường hai đỉnh đồ thị Tìm tất thành phần liên thơng Cho đồ thị G = (V, E), tìm tất thành phần liên thông đồ thị Đỉnh i đồ thị gán nhãn ci cho biết thuộc miền liên thơng ci Tìm 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 thăm, gán nhãn v ci (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 thăm) { (8) Xen u vào đuôi hàng đợi Q; (9) Đánh dấu u thăm, gán nhãn u ci } (10) Loại w khỏi hàng đợi Q } // hết vòng lặp while } Tìm thành phần liên thơng // Tìm thành phần liên thông đồ thị G=(V, E) FindAllConnectedComponent (G) { (10) for (mỗi v V) (11) Đánh dấu v chưa thăm; (12) ci = 0; (13) for (mỗi v V) (14) if (v chưa thăm) { (15) FindConnectedComponent(v, ci); (16) ci = ci + } } Đường ngắn Cho đồ thị G=(V, E), cạnh (u, v) ∈ E có độ dài weight (u,v) > Tìm đường ngắn từ đỉnh s đến đỉnh e Tư tưởng thuật toán Dijkstra (thuật toán gán nhãn) dist[v] = Khoảng cách đường ngắn từ s đến v pre[v] = u: Đỉnh liền phía trước đường ngắn từ s đến v Gán nhãn (sửa nhãn): Nếu dist[u] + weight (u, v) < dist [v] dist [v] = dist[u] + weight (u, v) pre[v] = u s→…→u→v Thuật toán Dijkstra Known = {tập hợp đỉnh xác định đường ngắn từ s đến} Unknown = {tập hợp đỉnh chưa xác định đường ngắn từ s đến} Tiến hành trình lặp, bước i tìm đỉnh u ∈ unknown có khoảng cách nhỏ if u = e then kết thúc else { known = known {u} unknown = unknown – {u} Dùng u để sửa nhãn cho đỉ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 cho dist[u] = {dist[x] | x ∈ unknown} Known = Known {u} Unknown = Unknown – {u} for v ∈ Unknown if dist[u] + weight [u, v] < dist[v] { //sửa nhãn cho v từ u dist[v] = dist[u] + weight[u,v]; pre[v] = u; } } path = {e} while (e != s) { e = pre[e] path = {e} path } } ... Đường hai điểm Cho đồ thị G = (V, E) Giữa hai đỉnh (x0, xk) có đường đi, tồn (x1,…,xk-1 ) thỏa mãn (xi, xi+1) ∈ E, ∀i = 0…(k-1) Đồ thị liên thông (Connected graph) Cho đồ thị G = (V, E), G gọi... (V, E), G gọi liên thông tồn đường hai đỉnh đồ thị Tìm tất thành phần liên thông Cho đồ thị G = (V, E), tìm tất thành phần liên thơng đồ thị Đỉnh i đồ thị gán nhãn ci cho biết thuộc miền liên thơng.. .Đồ 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 đồ đường thành phố đồ thị G = (V, E) – V: Tập hợp điểm thành