1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo thuật toán kruskal

18 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

BÀI TẬP LỚN Môn họcMô đun GHI TÊN BÀI TẬP Ở ĐÂY Ngành Công nghệ thông tin SINH VIÊN THỰC HIỆN Nguyễn Văn A MÃ SỐ SINH VIÊN 123456789 LỚP GV HƯỚNG DẪN MÔN HỌC THIẾT KẾ ĐỒ HỌA QUẢNG CÁO BÀI TẬP LỚN M. Định nghĩa Theo lý thuyết đồ thị, chúng ta đều biết rằng 1 đồ thị được biểu diễn bằng công thức G=(V,E)G=(V,E), trong đó đồ thị GG của chúng ta bao gồm tập các đỉnh VV và tập các cạnh EE. • Cây khung (spanning tree) của đồ thị là một tập hợp các cạnh của đồ thị thỏa mãn tập cạnh này không chứa chu trình và liên thông (từ một đỉnh bất kì có thể đi tới bất kỳ đỉnh nào khác theo mà chỉ dùng các cạnh trên cây khung) • Trong đồ thị có trọng số, cây khung nhỏ nhất (minimum spanning tree) là cây khung có tổng trọng số các cạnh trong cây nhỏ nhất.

BÀI TẬP LỚN Môn học/Mô đun:………………… GHI TÊN BÀI TẬP Ở ĐÂY Ngành: Công nghệ thông tin SINH VIÊN THỰC HIỆN: Nguyễn Văn A MÃ SỐ SINH VIÊN: 123456789 LỚP: GV HƯỚNG DẪN: BÀI TẬP LỚN Môn học/Mô đun: Thiết kế đồ họa & Quảng cáo GHI TÊN BÀI TẬP Ở ĐÂY Ngành: Công nghệ thông tin SINH VIÊN THỰC HIỆN: Nguyễn Văn A MÃ SỐ SINH VIÊN: 123456789 LỚP: … GV HƯỚNG DẪN: Tên GV NHẬN XÉT Nhận xét giảng viên hướng dẫn: ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… GIẢNG VIÊN HƯỚNG DẪN Th.S LỜI CAM ĐOAN Em xin cam đoan kết đạt đề tài … sản phẩm em thực hiện, không chép người khác Những tài liệu, thơng tin, hình ảnh tham khảo trích dẫn rõ ràng, pháp luật Em xin chịu trách nhiệm trước pháp luật lời cam đoan LỜI CẢM ƠN Gợi ý: Trong q trình tìm hiểu, thực …, khơng thể tránh khỏi thiếu sót Rất mong nhận góp ý từ thầy để thân hiểu rõ kiến thức liên quan đến mơn học, có nhiều kinh nghiệm để thực đề tài, dự án Trân trọng cảm ơn! (tùy theo khả nhóm/SV, viết theo ý riêng mình) Để hồn thành tập lớn này, em xin gửi lời cảm ơn tới Khoa Công nghệ thông tin - Trường Cao đẳng Công nghệ Bách Khoa Hà Nội tạo điều kiện thuận lợi cho em trình thực Chân thành cảm ơn thầy (cơ) … tận tình giảng dạy, hướng dẫn, giải đáp thắc mắc suốt trình học tập thực đề tài hướng dẫn, bảo em suốt thời gian thực J nã xin chân thành cảm ơn tất Thây, Cô Trường để giúp em thực tập lớn Mặc dù em có cố gắng, với trình độ cịn hạn ché, q trình thực đề ti khơng tránh khỏi thiếu sót Em hi vọng nhận ý kiến nhận xét, góp ý Thây giáo, Cô giáo kết triển khai tập lớn Em xin trân trọng cảm ơn! MỤC LỤC Contents PHẦN MỞ ĐẦU LỜI NÓI ĐẦU PHẦN LÝ THUYẾT Cây khung nhỏ Định nghĩa Theo lý thuyết đồ thị, biết đồ thị biểu diễn cơng thức G=(V,E)G=(V,E), đồ thị GG bao gồm tập đỉnh VV tập cạnh EE • Cây khung (spanning tree) đồ thị tập hợp cạnh đồ thị thỏa mãn tập cạnh khơng chứa chu trình liên thơng (từ đỉnh tới đỉnh khác theo mà dùng cạnh khung) • Trong đồ thị có trọng số, khung nhỏ (minimum spanning tree) khung có tổng trọng số cạnh nhỏ • Một ví dụ khung đồ thị vơ hướng khơng trọng số: • Một ví dụ khung nhỏ đồ thị vô hướng có trọng số: Trong khn khổ viết, làm việc với đồ thị vơ hướng có trọng số Tính chất Một vài tính chất khung nhỏ đồ thị vơ hướng có trọng số: • Tính chất chu trình: Trong chu trình CC bất kỳ, ee cạnh có trọng số lớn tuyệt đối (khơng có cạnh có trọng số ee) ee khơng thể nằm khung nhỏ • Đường hẹp nhất: Xét đỉnh uu, vv đồ thị Nếu ww trọng số cạnh lớn đường từ uu đến vv khung nhỏ đồ thị ta khơng thể tìm đường từ uu đến vv đồ thị ban đầu qua cạnh có trọng số nhỏ ww • Tính nhất: Nếu tất cạnh có trọng số khác có khung nhỏ Ngược lại, vài cạnh có trọng số giống có nhiều khung nhỏ • Tính chất cạnh nhỏ nhất: Nếu ee cạnh có trọng số nhỏ đồ thị, khơng có cạnh có trọng số ee ee nằm khung nhỏ đồ thị Chứng minh Lưu ý : bạn học khung lần đầu cân nhắc việc đọc chứng minh, tác giả khuyên bạn nên tạm thời bỏ qua phần Xuyên suốt bốn tính chất, ta sử dụng phép phản chứng để chứng minh • • • • Tính chất chu trình: Giả sử ee thuộc khung TT đồ thị, ta chứng minh tồn khung khác đồ thị có trọng số nhỏ TT o Ta thử xóa cạnh ee khỏi khung TT Lúc này, TT bị chia làm thành phần liên thông tổng trọng số giảm wewe o Xét đỉnh nằm chu trình CC, giả sử sau xóa ee khỏi khung, đỉnh liên thơng với Vì thế, thêm ee trở lại vào khung, ee kết nối đỉnh liên thông với ⇒⇒ tồn chu trình khung ⇒⇒ Trái với giả thiết TT khung ⇒ Vậy nên, xóa ee khỏi TT, đỉnh nằm chu trình CC bị tách làm thành phần liên thông Do đó, ta chọn cạnh e′e′ khác ee thuộc chu trình CC để kết nối thành liên thông này, biến TT trở lại thành khung đồ thị Mặt khác, ee cạnh có trọng số lớn tuyệt đối CC, nên thay ee e′e′, trọng số T giảm we−we ′we−we′ Kết luận: T khung nhỏ đồ thị Đường hẹp nhất: o Xét khung nhỏ TT đồ thị GG mà tồn đường u→vu→v GG có cạnh lớn nhỏ cạnh lớn đường u→vu→v TT o Gọi đường u→vu→v GG pathpath, cạnh lớn đường u→vu→v TT ee ⇒ Như vậy, xóa ee khỏi khung ban đầu, khung bị chia thành TPLT rời nhau, TPLT chứa uu TPLT lại chứa vv o Do pathpath đường u→vu→v GG nên pathpath tồn cạnh e′e′ kết nối TPLT Mà cạnh pathpath có trọng số nhỏ ee (như giả thiết) ⇒ Khi xoá ee thay e′e′, ta thu khung T′T′ có trọng số nhỏ khung ban đầu Kết luận: TT khung nhỏ đồ thị Tính nhất: o Giả sử tồn khung nhỏ TT T′T′ Xét cạnh u−vu−v nằm TT không T′T′ o Gọi đường u→vu→v TT pathpath, T′T′ path′path′ Hiển nhiên, path′path′ không chứa cạnh u−vu−v o Vì trọng số cạnh đồ thị khác ⇒⇒ Cạnh lớn pathpath có trọng số lớn trọng số cạnh lớn path′path ′ ngược lại ⇒ Theo tính chất đường hẹp nhất, TT T′T′ khung nhỏ Tính chất cạnh nhỏ nhất: Ta chứng minh khung không chứa ee đồ thị khung nhỏ o o Giả sử ee nối đỉnh uu, vv đồ thị Gọi TT khung không chứa ee đồ thị Xét cạnh e′e′ thuộc đường từ u→vu→v TT Khi xóa e′e ′ khỏi TT, TT bị tách làm thành phần liên thông, thành phần liên thông chứa uu, phần phần liên thông chứa vv ⇒ Do đó, ta hồn tồn o thêm cạnh ee (nối đỉnh u−vu−v) vào TT để kết nối thành phần liên thơng này, TT trở lại thành khung đồ thị Mặt khác, ee cạnh có trọng số nhỏ tuyệt đối đồ thị, nên thay e′e′ ee khung TT, trọng số TT giảm lượng dương Kết luận: TT ban đầu khung nhỏ đồ thị Thuật tốn tìm khung nhỏ Thuật tốn Kruskal Ý tưởng thuật toán: Ban đầu đỉnh riêng biệt, ta tìm khung nhỏ cách duyệt cạnh theo trọng số từ nhỏ đến lớn, hợp lại với Cụ thể hơn, giả sử cạnh xét nối đỉnh uu vv, đỉnh nằm khác ta thêm cạnh vào khung, đồng thời hợp chứa uu vv Giả sử ta cần tìm khung nhỏ đồ thị GG Thuật toán bao gồm bước sau: • • • Khởi tạo rừng FF (tập hợp cây), đỉnh G tạo thành riêng biệt Khởi tạo tập SS chứa tất cạnh GG Chừng SS khác rỗng FF gồm o Xóa cạnh nhỏ SS o Nếu cạnh nối hai khác FF, thêm vào FF hợp hai kề với làm o Nếu khơng loại bỏ cạnh Khi thuật tốn kết thúc, rừng gồm khung nhỏ đồ thị GG Ví dụ bước giải tốn tìm khung nhỏ với thuật toán Kruskal 10 : Để thực thao tác kiểm tra cạnh hợp cách nhanh chóng, ta sử dụng cấu trúc Disjoint Set, đoạn code dùng để cài đặt thuật toán: /*input 44 121 232 343 414 */ #include using namespace std; // Cấu trúc để lưu cạnh đồ thị // u, v đỉnh, c trọng số cạnh struct Edge { int u, v, c; Edge(int _u, int _v, int _c): u(_u), v(_v), c(_c) {}; }; struct Dsu { vector par; void init(int n) { par.resize(n + 5, 0); for (int i = 1; i edges; int main() { // Fast IO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 1; i > u >> v >> c; edges.push_back({u, v, c}); } dsu.init(n); // Sắp xếp lại cạnh theo trọng số tăng dần sort(edges.begin(), edges.end(), [](Edge & x, Edge & y) { return x.c < y.c; }); // Duyệt qua cạnh theo thứ tự xếp for (auto e : edges) { // Nếu không hợp đỉnh u v bỏ qua if (!dsu.join(e.u, e.v)) continue; // Nếu hợp u, v ta thêm trọng số cạnh vào kết totalWeight += e.c; } // Xuất kết cout

Ngày đăng: 13/09/2022, 22:34

TỪ KHÓA LIÊN QUAN

w