Bài giảng Cấu trúc dữ liệu: Chương 5 - TS. Trần Cao Đệ
lượt xem 5
download
Bài giảng Cấu trúc dữ liệu: Chương 5 - Đồ thị trình bày các kiểu dữ liệu trừu tượng đồ thị, biểu diễn đồ thị, các phép duyệt đồ thị,... Tham khảo nội dung bài giảng để hiểu rõ hơn về các nội dung trên.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Cấu trúc dữ liệu: Chương 5 - TS. Trần Cao Đệ
- CHƯƠNG V: ĐỒ THỊ (GRAPH) TS. Trần Cao Đệ Năm 2007
- ĐỒ THỊ Một đồ thị G=(V,E). V tập hợp các đỉnh (nút, điểm); E tập hợp các cung (cạnh) Cung nối giữa hai đỉnh (v,w), hai đỉnh này có thể trùng nhau. Hai đỉnh có cung nối nhau gọi là hai đỉnh kề Cung (v,w) có thứ tự thì ta có cung có thứ tự, ngược lại thì cung không có thứ tự. Đồ thị có hướng, vô hướng Đường đi (path) là một dãy tuần tự các đỉnh v1, v2,..., vn sao cho (vi,vi+1) là một cung trên đồ thị (i=1,...,n-1). Đường đi này là đường đi từ v1 đến vn và đi qua các đỉnh v2,...,vn-1. Đỉnh v1 còn gọi là đỉnh đầu, vn gọi là đỉnh cuối. Độ dài của đường đi này bằng (n-1). Trường hợp đặc biệt dãy chỉ có một đỉnh v thì ta coi đó là đường đi từ v đến chính nó có độ dài bằng không.
- đỉnh đầu và đỉnh cuối có thể trùng nhau. Một đường đi có đỉnh đầu và đỉnh cuối trùng nhau gọi là một chu trình (cycle). Một chu trình đơn là một đường đi đơn có đỉnh đầu và đỉnh cuối trùng nhau và có độ dài ít nhất là 1. Ví dụ trong hình thì 3, 2, 4, 3 tạo thành một chu trình có độ dài 3. Trong nhiều ứng dụng ta thường kết hợp các giá trị (value) hay nhãn (label) với các đỉnh và/hoặc các cạnh, lúc này ta nói đồ thị có nhãn. Đồ thị con của một đồ thị G=(V,E) là một đồ thị G'=(V',E') trong đó: V’ V và E’ gồm tất cả các cạnh (v,w) E sao cho v,w V’.
- KIỂU DỮ LIỆU TRỪU TƯỢNG ĐỒ THỊ Các phép toán trên đồ thị Thông thường trong các giải thuật trên đồ thị: Đọc nhãn của đỉnh. For (mỗi đỉnh w kề với v) { Đọc nhãn của cạnh. thao tác nào đó trên w Thêm một đỉnh vào đồ } thị. Thêm một cạnh vào đồ Định nghĩa thêm các phép toán thị. sau đây: FIRST(v): trả về chỉ số của Xoá một đỉnh. đỉnh đầu tiên kề với v. hoặc Xoá một cạnh. Null Lần theo (navigate) các NEXT(v,i): trả về chỉ số của cung trên đồ thị để đi từ đỉnh nằm sau đỉnh có chỉ số i và kề với v. hoặc Null đỉnh này sang đỉnh khác. VERTEX(i): trả về đỉnh có chỉ số i.
- BIỂU DIỄN ĐỒ THỊ Ma trận kề Ta dùng một mảng hai chiều Anxn, kiểu boolean Giả sử các đỉnh được đánh số 1..n thì A[i,j] = true, nếu có đỉnh nối giữa đỉnh thứ i và đỉnh thứ j, ngược lại thì A[i,j] = false. Trong cài đặt bằng C, có thể phải thay A[i,j] bởi A[i-1,j- 1]
- Cài đặt các phép toán //trả ra đỉnh sau đỉnh I mà kề với v int NEXT(int v, int i) { int j; FIRST, NEXT và VERTEX như sau: for (j=i+1; j
- Trên đồ thị có nhãn thì ma trận kề có thể dùng để lưu trữ nhãn của các cung chẳng hạn cung giữa i và j có nhãn a thì A[i,j]=a. Nếu i,j không có cung nối thì A[i,j]=??? sẽ được lựa chọn tùy theo bài toán
- Biểu diễn bằng danh sách các đỉnh kề
- CÁC PHÉP DUYỆT ĐỒ THỊ Duyệt theo chiều sâu //đánh dấu chưa duyệt tất cả các đỉnh (depth-first search) for (v =1; v
- CÁC PHÉP DUYỆT ĐỒ THỊ (tt) F G A Thứ tự duyệt đồ thị theo chiều sâu: AGBCDFE. E D C B B F G Duyệt theo chiều sâu Thứ tự duyệt đồ thị theo chiều sâu là: A D ABFDCEG. C E
- CÁC PHÉP DUYỆT ĐỒ THỊ (tt) Duyệt theo chiều rộng (breadth-first search) Giả sử đồ thị G với các đỉnh ban đầu được đánh dấu là chưa duyệt (unvisited). Từ một đỉnh v nào đó ta bắt đầu duyệt : đánh dấu v đã được duyệt, kế đến là duyệt tất cả các đỉnh kề với v. Khi ta duyệt một đỉnh v rồi đến đỉnh w thì các đỉnh kề của v được duyệt trước các đỉnh kề của w Dùng một hàng để lưu trữ các nút theo thứ tự được duyệt để có thể duyệt các đỉnh kề với chúng.
- Duyệt bfs //đánh dấu chưa duyệt tất cả các đỉnh void bfs(vertex v) {// v [1..n] for (v = 1; v
- Ví dụ Bắt đầu hàng các nút đã duyệt Đánh dấu A và A đưa vào hàng In A và đưa G vào G A hàng In G và đưa B,C B A, G C Tiếp tục duyệt ……. Kết quả???
- A, G, B, C, D F Bắt đầu hàng các nút đã duyệt A, G, B A, G, B, C, D, F C A, G, B, C A, G, B, C, D, F E D A, G, B, C A, G, B, C, D, F, E
- MỘT SỐ BÀI TOÁN TRÊN ĐỒ THỊ tìm đuờng đi ngắn nhất Đỉnh nguồn tìm đuờng đi ngắn nhất từ một đỉnh của đồ thị (the single source shorted path problem): Cho đồ thị (có hướng hoặc vô hướng) G =(V,E). Mỗi cạnh của đồ thị có một nhãn không âm, nhãn này còn gọi là giá (cost) của cạnh Hãy tìm đường đi Cho trước một đỉnh nguồn v ngắn nhất từ đỉnh Æ Tìm đường đi ngắn nhất từ v đến v=1 đến các đỉnh các đỉnh còn lại của G. còn lại!
- Giải thuật Dijkstra Giả sử G có n đỉnh (1..n) •2 cạnh (i,j) có giá là C[i,j] •1 •3 Nếu i và j không nối nhau thì •4 C[i,j]=∞. •5 Dùng mảng 1 chiều D[1..n] lưu độ dài của đường đi ngắn nhất từ mỗi đỉnh của đồ thị đến v. Khởi đầu D[i]=C[v,i]. S V-S Tại mỗi bước D[i] sẽ được cập nhật lại để lưu độ dài đường đi Tìm đỉnh w ngắn nhất đến S ngắn nhất từ đỉnh v tới đỉnh i, đường đi này chỉ đi qua các đỉnh và thêm w vào S cho đế khi S=V đã có trong S. Dùng mảng 1 chiều P[1..n], trong đó P[i] lưu đỉnh trước của đỉnh I trong đường đi ngắn nhất.
- Giải thuật Dijkstra Đỉnh nguồn {1} - 10 ∞ 30 100 {1,2} 2 10 60 30 100 {1,2,4} 4 10 40 30 90 {1,2,4,3} 3 10 40 30 50 P 1 2 3 4 5 {1,2,4,3,5} 5 10 40 30 50 1 1 1 1 1 2 1 1 D[u] = min(D[u], D[w]+C[w,u]) 1 4 1 4 1 4 1 3
- Giải thuật Dijkstra void Dijkstra() { void Dijkstra(){ S = [1]; //S chỉ chứa một đỉnh S =[1]; //S chỉ chứa một đỉnh nguồn nguồn for(i=2; i
- Đường đi ngắn nhất giữa tất cả các cặp đỉnh Giải thuật Floyd Công thức: for (i=1; i
- Tìm bao đóng chuyển tiếp (transitive closure) giải thuật Washall Chỉ cần xác định có hay không có giải thuật Warshall. đường đi nối giữa hai đỉnh i,j bất int A[n][n], C[n][n]; kỳ. void Warshall(){ Giải thuật Floyd có thể đặc biệt int i,j,k; hoá để giải bài toán này. for (i=1; i
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Cấu trúc dữ liệu & thuật toán: Chương 3 - Nguyễn Đức Nghĩa
0 p | 491 | 166
-
Bài giảng Cấu trúc dữ liệu - Bài 1:Tổng quan về cấu trúc dữ liệu và giải thuật
47 p | 179 | 17
-
Bài giảng Cấu trúc dữ liệu: Chương 10 - Nguyễn Xuân Vinh
31 p | 95 | 10
-
Bài giảng Cấu trúc dữ liệu 1: Chương 1 - Lương Trần Hy Hiến
7 p | 162 | 9
-
Bài giảng Cấu trúc dữ liệu giải thuật: Các kiểu dữ liệu trừu tượng cơ bản - Cấu trúc dữ liệu tuyến tính
92 p | 117 | 9
-
Bài giảng Cấu trúc dữ liệu: Chương Giới thiệu - Nguyễn Xuân Vinh
8 p | 112 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu
193 p | 62 | 7
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (2016)
62 p | 94 | 6
-
Bài giảng Cấu trúc dữ liệu - Chương 3: Cấu trúc cây
65 p | 59 | 6
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 - Trần Minh Thái (Trường Đại học Hồng Bàng )
62 p | 173 | 6
-
Bài giảng Cấu trúc dữ liệu: Chương 5 - Cấu trúc dữ liệu cây
32 p | 86 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 7 - Châu Thị Bảo Hà
133 p | 115 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 1 – Trần Minh Thái (2017)
67 p | 107 | 4
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Các khái niệm cơ bản
23 p | 48 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 5 - Ngô Quang Thạch
24 p | 58 | 3
-
Bài giảng Cấu trúc dữ liệu và giải thuật: Chương 2 - Th.S Thiều Quang Trung
41 p | 70 | 3
-
Bài giảng Cấu trúc dữ liệu 1 - Nguyễn Thái Dư
85 p | 81 | 3
-
Bài giảng Cấu trúc dữ liệu giải thuật: Cấu trúc dữ liệu
17 p | 53 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn