intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Cấu trúc dữ liệu: Chương 5 - TS. Trần Cao Đệ

Chia sẻ: Hoa La Hoa | Ngày: | Loại File: PDF | Số trang:0

57
lượt xem
5
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Cấu trúc dữ liệu: Chương 5 - TS. Trần Cao Đệ

  1. CHƯƠNG V: ĐỒ THỊ (GRAPH) TS. Trần Cao Đệ Năm 2007
  2. ĐỒ 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.
  3. „ đỉ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’.
  4. 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.
  5. 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]
  6. 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
  7. „ 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
  8. Biểu diễn bằng danh sách các đỉnh kề
  9. 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
  10. 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
  11. 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.
  12. 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
  13. 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ả???
  14. 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
  15. 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!
  16. 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.
  17. 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
  18. 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
  19. Đườ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
  20. 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
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2