Bài giảng trình bày về các bài toán áp dụng cho phương pháp tham lam, như bài toán Cây bao trùm nhỏ nhất, bài toán tô màu và bài toán các khoảng không giao nhau. Tài liệu hữu ích dành cho các bạn sinh viên ngành Công nghệ thông tin. Mời các bạn cùng tham khảo.
2/2/2017 Analysis and Design of Algorithms Lecture 6,7 The Greedy algorithms Lecturer: Ha Dai Duong duonghd@mta.edu.vn 2/2/2017 Nội dung Lược đồ chung Bài toán túi Bài toán người du lịch Đường ngắn Cây bao trùm nhỏ Bài toán tô màu Bài toán khoảng không giao 2/2/2017 Bài toán • Cho đơn đồ thị G=(V,E) – V: Tập đỉnh – E: Tập cạnh • Cây T gọi bao trùm G T đồ thị G chứa tất đỉnh thuộc G (có số đỉnh =V) • Tìm bao trùm có trọng số nhỏ (Minimal Spanning Tree) MST 2/2/2017 2/2/2017 Thuật toán Prim • T = GT(VT,ET) khung tối thiểu cần tìm • Ý tưởng – Chọn đỉnh tùy ý vào V T – Khi |VT| < |V| • Tìm cạnh (s,t) sVT, tV\VT có trọng số nhỏ (tham lam) nối VT V\VT • Thêm đỉnh t vào V T, (s,t) vào ET 2/2/2017 Minh họa • Cho đồ thị G = (V,E) = 2/2/2017 Khởi tạo • Bắt đầu từ đỉnh 1 Đồ thị G 2/2/2017 MST T 2/2/2017 Bước • Bắt đầu từ đỉnh 1 Đồ thị G MST T 2/2/2017 Bước • Bắt đầu từ đỉnh 1 2 Đồ thị G MST T 2/2/2017 Bước • Bắt đầu từ đỉnh 1 2 4 Đồ thị G 2/2/2017 MST T 2/2/2017 Bước • Bắt đầu từ đỉnh 1 Đồ thị G MST T 2/2/2017 10 Bước • Bắt đầu từ đỉnh 1 4 Đồ thị G MST T 2/2/2017 11 Bước • Bắt đầu từ đỉnh 1 Đồ thị G 4 2/2/2017 7 MST T 12 2/2/2017 Kết • MST T= (VT,ET) – VT=V = {1,2,3,4,5,6,7} – ET={(1,2), (2,3), (1,4), (4,5), (4,7), (6,7),} - W(T) = 17 (Trọng số T) 7 MST T 2/2/2017 13 Cài đặt • Biểu diễn G qua ma trận trọng số cạnh • Mảng Closest[i]: Giá trị đỉnh kề gần i • Mảng lowcost[i]: cho trọng số cạnh (i,closest[i]) 2/2/2017 14 2/2/2017 15 2/2/2017 Bài toán • Cho đơn đồ thị G=(V,E) – V: Tập đỉnh – E: Tập cạnh • Cây T gọi bao trùm G T đồ thị G chứa tất đỉnh thuộc G (có số đỉnh =V) • Tìm bao trùm có trọng số nhỏ (Minimal Spanning Tree) MST 2/2/2017 16 Thuật toán Kruskal • T = GT(VT,ET) khung tối thiểu cần tìm • Khi G có n đỉnh T có n-1 cạnh • Ý tưởng (tham lam): Xây dựng tập n-1 cạnh T theo nguyên tắc: – Khởi tạo ET={}, VT = V – Xét cạnh có trọng số nhỏ đến lớn không tạo thành chu trình T thêm cạnh vào ET 2/2/2017 17 Minh họa • Cho đồ thị G = (V,E) = 2/2/2017 18 2/2/2017 Khởi tạo Đồ thị G MST T 2/2/2017 19 Bước 1 Đồ thị G MST T 2/2/2017 20 Bước 1 Đồ thị G 2/2/2017 MST T 21 2/2/2017 Bước 1 Đồ thị G MST T 2/2/2017 22 Bước 1 Đồ thị G MST T 2/2/2017 23 Bước 1 Đồ thị G 2/2/2017 3 2 MST T 24 2/2/2017 Bước 1 3 Đồ thị G MST T 2/2/2017 25 Kết • MST T= (VT,ET) – VT=V = {1,2,3,4,5,6,7} – ET={(1,4), (1,2), (3,4), (4,6), (5,6), (6,7),} - W(T) = 15 (Trọng số T) 2/2/2017 3 MST T 26 Cài đặt • Mô tả G ma trận trọng số cạnh A[i,j] • D mảng chiều, D[i]=k đỉnh i thuộc vào thứ k, D[i] = đỉnh i chưa thuộc vào • Tìm {A[i][j] } j = n, i =1 n trừ cạnh (i,j) mà D[i]=D[j]0 (những cạnh tạo thành chu trình) • Thêm cạnh vừa tìm vào T, lặp lại bước T rừng 2/2/2017 27 2/2/2017 Cài đặt • Xử lý cạnh (i,j) thêm vào T: – Nếu D[i]=D[j]=0, cạnh (i,j) chưa thuộc vào nên lấy đỉnh vào tập cạnh ta cho chúng thuộc vào Khi k=k+1 D[i]=D[j]=k – Nếu D[i]=0 D[j]0: i chưa thuộc vào T, j thuộc T => Ghép i vào chứa j, D[i]=D[j] – Nếu D[i]0 D[j]=0: i thuộc vào T, j không thuộc T => Ghép j vào chứa i, D[j]=D[i] – Nếu D[i]D[j] D[i]0, D[j]0: i, j thuộc khác T => Ghép thành 2/2/2017 28 Cài đặt • Xử lý cạnh (i,j) thêm vào T: – Nếu D[i]=D[j]=0, cạnh (i,j) chưa thuộc vào nên lấy đỉnh vào tập cạnh ta cho chúng thuộc vào Khi k=k+1 D[i]=D[j]=k – Nếu D[i]=0 D[j]0: i chưa thuộc vào T, j thuộc T => Ghép i vào chứa j, D[i]=D[j] – Nếu D[i]0 D[j]=0: i thuộc vào T, j không thuộc T => Ghép j vào chứa i, D[j]=D[i] – Nếu D[i]D[j] D[i]0, D[j]0: i, j thuộc khác T => Ghép thành 2/2/2017 29 Cài đặt • Xử lý cạnh (i,j) thêm vào T: – Nếu D[i]=D[j]=0, cạnh (i,j) chưa thuộc vào nên lấy đỉnh vào tập cạnh ta cho chúng thuộc vào Khi k=k+1 D[i]=D[j]=k – Nếu D[i]=0 D[j]0: i chưa thuộc vào T, j thuộc T => Ghép i vào chứa j, D[i]=D[j] – Nếu D[i]0 D[j]=0: i thuộc vào T, j không thuộc T => Ghép j vào chứa i, D[j]=D[i] – Nếu D[i]D[j] D[i]0, D[j]0: i, j thuộc khác T => Ghép thành 2/2/2017 30 10 2/2/2017 Cài đặt • Xử lý cạnh (i,j) thêm vào T: – Nếu D[i]=D[j]=0, cạnh (i,j) chưa thuộc vào nên lấy đỉnh vào tập cạnh ta cho chúng thuộc vào Khi k=k+1 D[i]=D[j]=k – Nếu D[i]=0 D[j]0: i chưa thuộc vào T, j thuộc T => Ghép i vào chứa j, D[i]=D[j] – Nếu D[i]0 D[j]=0: i thuộc vào T, j không thuộc T => Ghép j vào chứa i, D[j]=D[i] – Nếu D[i]D[j] D[i]0, D[j]0: i, j thuộc khác T => Ghép thành 2/2/2017 31 Cài đặt typedef struct Egde { int x,y; }; void Kruskal(int **A, int n){ char *D = new char[n]; Egde *L = new Egde[n-1]; int min, Dem = 0, Sum = 0, T = 0, Temp; for(int i=0; i