intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Giáo trình cấu trúc dữ liệu part 10

Chia sẻ: Asdhkj Aksjdhwu | Ngày: | Loại File: PDF | Số trang:7

90
lượt xem
19
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'giáo trình cấu trúc dữ liệu part 10', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

Nội dung Text: Giáo trình cấu trúc dữ liệu part 10

  1. Cấu trúc dữ liệu Chương V: Đồ thị { D[u-1] =D[w-1] + C[w-1,u-1]; P[u-1] =w; } } } Ví dụ: áp dụng giải thuật Dijkstra cho đồ thị hình V.5 Kết quả khi áp dụng giải thuật Lần lặp S W D[2] D[3] D[4] D[5] ∞ Khởi đầu {1} - 30 100 10 1 {1,2} 2 10 60 30 100 2 {1,2,4} 4 10 30 90 40 3 {1,2,3,4} 3 10 40 30 50 4 {1,2,3,4,5} 5 10 40 30 50 Mảng P có giá trị như sau: P 1 2 3 4 5 1 4 1 3 Từ kết quả trên ta có thể suy ra rằng đường đi ngắn nhất từ đỉnh 1 đến đỉnh 3 là 1 → 4 → 3 có độ dài là 40. đường đi ngắn nhất từ 1 đến 5 là 1 → 4 → 3→ 5 có độ dài 50. 2. Tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh Giả sử đồ thị G có n đỉnh được đánh số từ 1 đến n. Khoảng cách hay giá giữa các cặp đỉnh được cho trong mảng C[i,j]. Nếu hai đỉnh i,j không được nối thì C[i,j]= ¥. Giải thuật Floyd xác định đường đi ngắn nhất giữa hai cặp đỉnh bất kỳ bằng cách lặp k lần, ở lần lặp thứ k sẽ 145 Trang
  2. Cấu trúc dữ liệu Chương V: Đồ thị xác định khoảng cách ngắn nhất giữa hai đỉnh i,j theo công thức: Ak[i,j]=min(Ak-1[i,j], Ak- 1[i,k]+Ak-1[k,j]). Ta cũng dùng mảng P để lưu các đỉnh trên đường đi. float A[n,n], C[n,n]; int P[n,n]; void Floyd() { int i,j,k; for (i=1; i
  3. Cấu trúc dữ liệu Chương V: Đồ thị i,j là không quan trọng mà ta chỉ cần biết i,j có nối nhau không do đó ta cho C[i,j]=1 (~true) nếu i,j được nối nhau bởi một cạnh, ngược lại C[i,j]=0 (~false). Lúc này mảng A[i,j] không cho khoảng cách ngắn nhất giữa i,j mà nó cho biết là có đường đi từ i đến j hay không. A gọi là bao đóng chuyển tiếp của đồ thị G có biểu diễn ma trận kề là C. Giải thuật Floyd sửa đổi như trên gọi là giải thuật Warshall. int A[n,n], C[n,n]; void Warshall() { int i,j,k; for (i=1; i
  4. Cấu trúc dữ liệu Chương V: Đồ thị Ví dụ, áp dụng giải thuật Prim để tìm cây bao trùm tối thiểu của đồ thị liên thông hình V.6. Bước khởi đầu: U={1}, T=∅. Bước kế tiếp ta có cạnh (1,3)=1 là cạnh ngắn nhất thoả mãn điều kiện trong giải thuật Prim nên: U={1,3}, T={(1,3)}. Kế tiếp thì cạnh (3,6)=4 là cạnh ngắn nhất thoả mãn điều kiện trong giải thuật Prim nên: U={1,3,6}, T={(1,3),(3,6)}. Kế tiếp thì cạnh (6,4)=2 là cạnh ngắn nhất thoả mãn điều kiện trong giải thuật Prim nên: U={1,3,6,4}, T={(1,3),(3,6),(6,4)}. Tiếp tục, cạnh (3,2)=5 là cạnh ngắn nhất thoả mãn điều kiện trong giải thuật Prim nên: U={1,3,6,4,2}, T={(1,3),(3,6),(6,4),(3,2)}. Cuối cùng, cạnh (2,5)=3 là cạnh ngắn nhất thoả mãn điều kiện trong giải thuật Prim nên: U={1,3,6,4,2,5}, T={(1,3),(3,6),(6,4),(3,2),(2,5)}. Giải thuật dừng và ta có cây bao trùm như trong hình V.7. Giải thuật Prim được viết lại như sau: void Prim(graph G, set_of_edges *T) { set_of_vertices U; //tập hợp các đỉnh vertex u,v; //u,v là các đỉnh T = ∅; U = [1]; 148 Trang
  5. Cấu trúc dữ liệu Chương V: Đồ thị while (U≠V) do // V là tập hợp các đỉnh của G { gọi (u,v) là cạnh ngắn nhất sao cho u ∈ U và v ∈ V-U; U = U ∪ [v]; T = T ∪ [(u,v)]; } } Bài toán cây bao trùm tối thiểu còn có thể được giải bằng giải thuật Kruskal như sau: Khởi đầu ta cũng cho T= ∅ giống như trên, ta thiết lập đồ thị khởi đầu G'=(V,T). Xét các cạnh của G theo thứ tự độ dài tăng dần. Với mỗi cạnh được xét ta sẽ đưa nó vào T nếu nó không làm cho G' có chu trình. Ví dụ áp dụng giải thuật Kruskal để tìm cây bao trùm cho đồ thị hình V.6. Các cạnh của đồ thị được xếp theo thứ tự tăng dần là. (1,3)=1, (4,6)=2, (2,5)=3, (3,6)=4, (1,4)=(2,3)=(3,4)=5, (1,2)=(3,5)= (5,6)=6. Bước khởi đầu T= ∅ Lần lặp 1: T={(1,3)} Lần lặp 2: T={(1,3),(4,6)} Lần lặp 3: T={(1,3),(4,6),(2,5)} Lần lặp 4: T={(1,3),(4,6),(2,5),(3,6)} Lần lặp 5: Cạnh (1,4) không được đưa vào T vì nó sẽ tạo ra chu trình 1,3,6,4,1. Kế tiếp cạnh (2,3) được xét và được đưa vào T. T={(1,3),(4,6),(2,5),(3,6),(2,3)} Không còn cạnh nào có thể được đưa thêm vào T mà không tạo ra chu trình. Vậy ta có cây bao trùm tối thiểu cũng giống như trong hình V.7. 149 Trang
  6. Cấu trúc dữ liệu Chương V: Đồ thị BÀI TẬP 1. Viết biểu diễn đồ thị V.8 bằng: - Ma trận kề. - Danh sách các đỉnh kề. 2. Duyệt đồ thị hình V.8 (xét các đỉnh theo thứ tự a,b,c...) - Theo chiều rộng bắt đầu từ a. - Theo chiều sâu bắt đầu từ f 3. Áp dụng giải thuật Dijkstra cho đồ thị hình V.8, với đỉnh nguồn là a. 4. Viết biểu diễn đồ thị V.9 bằng: Ma trận kề. Danh sách các đỉnh kề. 5. Duyệt đồ thị hình V.9 (xét các đỉnh theo thứ tự A,B,C...) Theo chiều rộng bắt đầu từ A. Theo chiều sâu bắt đầu từ B. 6. Áp dụng giải thuật Dijkstra cho đồ thị hình V.9, với đỉnh nguồn là A. 7. Tìm cây bao trùm tối thiểu của đồ thị hình V.9 bằng Giải thuật Prim. Giải thuật Kruskal. 8. Cài đặt đồ thị có hướng bằng ma trận kề rồi viết các giải thuật: Duyệt theo chiều rộng. Duyệt theo chiều sâu. Tìm đường đi ngắn nhất từ một đỉnh cho trước (Dijkstra). Tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh (Floyd). 9. Cài đặt đồ thị có hướng bằng danh sách các đỉnh kề rồi viết các giải thuật: Duyệt theo chiều rộng. 150 Trang
  7. Cấu trúc dữ liệu Chương V: Đồ thị Duyệt theo chiều sâu. 10. Cài đặt đồ thị vô hướng bằng ma trận kề rồi viết các giải thuật: Duyệt theo chiều rộng. Duyệt theo chiều sâu. Tìm đường đi ngắn nhất từ một đỉnh cho trước (Dijkstra). Tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh (Floyd). Tìm cây bao trùm tối thiểu (Prim, Kruskal). Cài đặt thuật toán Greedy cho bài toán tô màu đồ thị (Gợi ý: xem giải thuật trong chương 1) 11. Cài đặt đồ thị vô hướng bằng danh sách các đỉnh kề rồi viết các giải thuật: Duyệt theo chiều rộng. Duyệt theo chiều sâu. 12. Hãy viết một chương trình, trong đó, cài đặt đồ thị vô hướng bằng cấu trúc ma trận kề rồi viết các thủ tục/hàm sau: Nhập toạ độ n đỉnh của đồ thị. Giả sử đồ thị là đầy đủ, tức là hai đỉnh bất kỳ đều có cạnh nối, và giả sử giá của mỗi cạnh là độ dài của đoạn thẳng nối hai cạnh. Hãy tìm: Đường đi ngắn nhất từ một đỉnh cho trước (Dijkstra). Đường đi ngắn nhất giữa tất cả các cặp đỉnh (Floyd). Cây bao trùm tối thiểu (Prim, Kruskal). Thể hiện đồ thị lên màn hình đồ hoạ, các cạnh thuộc cây bao trùm tối thiểu được vẽ bằng một màu khác với các cạnh khác. 151 Trang
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2