1. Trang chủ
  2. » Giáo án - Bài giảng

Bài Giảng Lý Thuyết Đồ Thị

342 0 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

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

Ngày đăng: 17/06/2023, 02:21