LÝ THUYẾT ĐỒ THỊ MÔN HỌC KHOA CÔNG NGHỆ THÔNG TIN NỘI DUNG 2 Bài 1 CÁC KHÁI NIỆM CƠ BẢN Bài 2 ĐƯỜNG ĐI VÀ CHU TRÌNH Bài 3 ĐỒ THỊ PHẲNG Bài 4 CÂY Bài 5 ĐƯỜNG ĐI NGẮN NHẤT Bài 6 MỘT SỐ BÀI TOÁN ỨNG DỤNG[.]
KHOA CÔNG NGHỆ THÔNG TIN MÔN HỌC: LÝ THUYẾT ĐỒ THỊ NỘI DUNG Bài 1: CÁC KHÁI NIỆM CƠ BẢN Bài 2: ĐƯỜNG ĐI VÀ CHU TRÌNH Bài 3: ĐỒ THỊ PHẲNG Bài 4: CÂY Bài 5: ĐƯỜNG ĐI NGẮN NHẤT Bài 6: MỘT SỐ BÀI TOÁN ỨNG DỤNG NỘI DUNG Bài 1: CÁC KHÁI NIỆM CƠ BẢN Bài 2: ĐƯỜNG ĐI VÀ CHU TRÌNH Bài 3: ĐỒ THỊ PHẲNG Bài 4: CÂY Bài 5: ĐƯỜNG ĐI NGẮN NHẤT Bài 6: MỘT SỐ BÀI TOÁN ỨNG DỤNG Các khái niệm Giới thiệu - Bài toán cầu Konigsberg: Có cách để dạo qua tất bảy cầu, mà cầu qua lần ? Các khái niệm Giới thiệu - Năm 1736, năm khai sinh lý thuyết đồ thị, qua việc công bố lời giải toán cầu Konigsberg nhà toán học Euler C A Nhà toán học Thụy Sĩ: Leonhard Euler D B (April 1707 – September 1783) Các khái niệm Định nghĩa: Đồ thị G xác định (V, E) gồm: - V tập hợp hữu hạn khác rỗng phần tử gọi đỉnh (hay nút) đồ thị; - E tập hợp cặp đỉnh Mỗi phần tử E gọi cạnh Các khái niệm Định nghĩa: Cho hai đồ thị G = (V,E) G’ = (V’,E’) G’ gọi đồ thị G, ký hiệu G’≤ G V’ ⊆ V E’ ⊆ E Nếu V’ = V E’ ⊆ E G’ gọi đồ thị khung G G H Các khái niệm Phân loại đồ thị Đồ thị G phân loại theo đặc tính số lượng tập cạnh E: Các khái niệm Phân loại đồ thị Đồ thị G phân loại theo đặc tính số lượng tập cạnh E: - G gọi đơn đồ thị hai đỉnh u, v thuộc V có nhiều cạnh; Detroit New York San Francisco Chicago Denver Washington Los Angeles Các khái niệm Phân loại đồ thị Đồ thị G phân loại theo đặc tính số lượng tập cạnh E: - G gọi đa đồ thị hai đỉnh u, v thuộc V có nhiều cạnh Detroit New York San Francisco Denver Chicago Washington Los Angeles 10 Thuật tốn tìm luồng cực đại Thuật toán Ford – Fulkerson (Sơ lược) Bước 1: [Khởi tạo] Khởi tạo luồng Bước 2: [Lặp] Tìm đường tăng luồng P Nếu tìm Tăng luồng dọc theo đường tăng luồng P Cho đến khơng thể tìm đường tăng luồng P Thuật tốn tìm luồng cực đại Thuật tốn Ford – Fulkerson (Chi tiết) Bước 1: [Khởi tạo] Khởi tạo luồng 0: F(e)=0 (∀e∈E) Bước 2: Gán nhãn – Tìm đường tăng luồng Dùng mảng nhãn nhan[x] (x đỉnh) Ban đầu đỉnh x nhãn nhan[s] = s (đỉnh s có nhãn) Lặp Thuật tốn tìm luồng cực đại • Với đỉnh i j thỏa điều kiện: i có nhãn j chưa có nhãn • Nếu có cung (i, j) giá trị luồng F(i, j) < c(i, j) ta gán nhãn j: nhan[j] = +i; • Nếu có cung (j, i) giá trị luồng F(j, i) > ta gán nhãn j: nhan[j] = -i; Cho đến khi: • Hoặc đỉnh thu t có nhãn chuyển qua bước () • Hoặc khơng cịn gán nhãn dừng thuật tốn luồng lớn Thuật toán tìm luồng cực đại Bước 3: Lần ngược từ t s để “đường đi” tăng luồng(vì có cung từ i j hay cung ngược j i) t s Thuật tốn tìm luồng cực đại Bước 4: [Tăng luồng] Trên đường tìm 3, ta sửa lại luồng cung theo quy tắc sau: Nếu cung định hướng t tăng luồng lên đơn vị Ngược lại giảm luồng đơn vị Quay lại bước t s Thuật tốn tìm luồng cực đại Ví dụ: Dùng thuật tốn Ford – Fulkerson tìm luồng cực đại cho đồ thị sau s 1 1 t Thuật tốn tìm luồng cực đại • Bước 1: Khởi tạo luồng Lần 1: s 0 t Bước 2: Gán nhãn 0 nhan[2]=1; nhan[4]=1; nhan[3]=2; nhan[5]=2; nhan[6]=3 – Bước 3: Lần ngược t=6 ←3 ←2 ←1=s – Bước 4: Tăng luồng s 1 0 t Thuật tốn tìm luồng cực đại s 1 t 0 Lần 2: Bước 2: Gán nhãn • Khơng gán nhãn cho đỉnh được: nhan[4]=1; nhan[3] = • Đỉnh chưa có nhãn: Có cung (2,3 ) F(2,3)>0 nên nhan[2]=-3 nhan[5]=2; nhan[6]=5 Thuật tốn tìm luồng cực đại – Bước 3: Lần ngược T=6 ←5 ←2 ←3 ← ← 1=s – Bước 4: Tăng luồng s 1 1 Lần 2: nhan[s]=s đỉnh khác nhãn Dừng thuật tốn ta luồng cực đại w=2 t Thuật tốn tìm luồng cực đại Lưu ý: Trong thuật tốn trình bày, lần tăng luồng ta tăng luồng lên Để giải toán luồng với số thực, tăng luồng bước cho đường luồng đầy, ta tiến hành sau: Đầu tiên: Tính giá trị d=min{w(i, j) – F(i, j)} Sau đó: Trên đường tăng luồng ta tăng giá trị d Thuật tốn tìm luồng cực đại Cài đặt CTDL #define BOOL int #define TRUE #define FALSE #define MAXN 100 int c[MAXN][MAXN]; int n; int F[MAXN][MAXN]; int nhan[MAXN]; Thuật toán tìm luồng cực đại void MaximumNetworkFlow() { BOOL thoat; { thoat = GanNhan(); if (!thoat) { TangLuong(); } } while(!thoat); } Thuật tốn tìm luồng cực đại BOOL GanNhan() { } Thuật tốn tìm luồng cực đại void TangLuong() { } // Backtracking Tóm tắt