Tài liệu ôn thi toán rời rạc

17 161 0
Tài liệu ôn thi toán rời rạc

Đ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

Tổng hợp các bài tập, đề thi môn Toán rời rạc các năm

1.2 ĐƯỜNG ĐI, CHU TRÌNH, ĐỒ THỊ LIÊN THƠNG Đồ thị vô hướng liên thông đồ thị mà hai đỉnh tồn đường đến Thành phần liên thông: Trong trường hợp đồ thị khơng liên thơng, rã thành số đồ thị liên thơng đơi khơng có đỉnh chung Những đồ thị liên thông ta gọi thành phần liên thông đồ thị 1.2 ĐƯỜNG ĐI, CHU TRÌNH, ĐỒ THỊ LIÊN THƠNG ĐƯỜNG ĐI ĐỘ DÀI N TRONG ĐỒ THỊ CĨ HƯỚNG Đường độ dài n từ đỉnh u đến đỉnh v, đó, n số nguyên dương, đồ thị có hướng G = (V, E) dãy x0, x1,…, xn-1, xn u = x0, v = xn, (xi , xi+1)∈ E, i = 0, 1, 2,…, n1 Đường nói biểu diễn dạng dãy cung: (x0, x1), (x1, x2), …, (xn-1, xn) Đỉnh u gọi đỉnh đầu, đỉnh v gọi đỉnh cuối đường Đường có đỉnh đầu trùng với đỉnh cuối (tức u = v) gọi chu trình Đường hay chu trình gọi đơn khơng có cung bị lặp lại 1.2 ĐƯỜNG ĐI, CHU TRÌNH, ĐỒ THỊ LIÊN THƠNG ĐƯỜNG ĐI ĐỘ DÀI N TRONG ĐỒ THỊ CÓ HƯỚNG Đường độ dài n từ đỉnh u đến đỉnh v, đó, n số nguyên dương, đồ thị có hướng G = (V, E) dãy x0, x1,…, xn-1, xn u = x0, v = xn, (xi , xi+1)∈ E, i = 0, 1, 2,…, n1 Đường nói biểu diễn dạng dãy cung: (x0, x1), (x1, x2), …, (xn-1, xn) Đỉnh u gọi đỉnh đầu, đỉnh v gọi đỉnh cuối đường Đường có đỉnh đầu trùng với đỉnh cuối (tức u = v) gọi chu trình Đường hay chu trình gọi đơn khơng có cung bị lặp lại Bài Đồ thị Euler - Chu trình đơn đồ thị G qua cạnh lần gọi chu trình Euler - Đường đơn G qua cạnh lần gọi đường Euler - Đồ thị gọi đồ thị Euler có chu trình Euler, gọi đồ thị nửa Euler có đường Euler 3.3 Định lý Euler thuật tốn Flor Định lý 3.1 (Euler) Đồ thị vơ hướng liên thông G đồ thị Euler đỉnh G có bậc chẵn Bổ đề 3.1 Nếu bậc đỉnh đồ thị G khơng nhỏ G chứa chu trình v → v1 →v2 → → vi → ??? CM định lý: ĐK cần: Nếu đồ thị Euler bậc tất đỉnh chẵn Do tồn chu trình Euler ( chu trình qua cạnh lần); lần chu trình qua đỉnh bậc đỉnh tăng lên ⇒Bậc tất đỉnh chẵn ⇒3.3 Định lý Euler thuật tốn Flor ⇒Định lý 3.1 (Euler) Đồ thị vơ hướng liên thông G đồ thị Euler đỉnh G có bậc chẵn ⇒CM định lý: ⇒ĐK đủ: Nếu bậc tất đỉnh chẵn đồ thị Euler ⇒3.3 Định lý Euler thuật toán Flor ⇒Hệ 3.1 Đồ thị vô hướng liên thông G nửa Euler có khơng q đỉnh bậc lẻ ⇒Thuật tốn Flor để liệt kê chu trình Euler ⇒Xuất phát từ đỉnh đó, qua cạnh đồ thị qua cạnh cầu khơng lựa chọn khác; ⇒3.3 Định lý Euler thuật toán Flor ⇒Hệ 3.1 Đồ thị vô hướng liên thông G nửa Euler có khơng q đỉnh bậc lẻ ⇒Thuật tốn Flor để liệt kê chu trình Euler ⇒void Euler_Cycle() ⇒{ STACK=∅ ; CE=∅ ;// Khởi tạo stack rỗng; CE tập cạnh chu trình ⇒Chọn u đỉnh đồ thị; ⇒STACK¬ u; // Đưa u vào Stack ⇒ while (STACK!=∅) ⇒{ x=top(STACK); //x la phan tu dau STACK ⇒if (Ke(x)!=∅) ⇒{ y = dinh dau tien danh sach Ke(x); ⇒STACK¬ y; ⇒//* loai bo canh (x,y) khoi thi ⇒Ke(x)=Ke(x)\ { y} ; Ke(y)=Ke(y)\{ x} ; ⇒} ⇒Else x⇐ STACK; CE⇐ x; ⇒} ⇒} ⇒3.3 Định lý Euler thuật toán Flor ⇒Ke(B)= {C, E} ⇒Ke( C) = { B, D} ⇒Ke( D) = {C, E} ⇒Ke(E ) = {B, D} ⇒Xuất phát từ đỉnh B; ⇒Cho B vào Stack ⇒Lần lượt duyệt Stack ⇒Bước lặp 1: ⇒X = B ; ( B đỉnh Stack) ⇒Kiểm tra Ke(X) tức Ke(B) = {C, E} khác rỗng ⇒Gán Y = C ( C phần tử DS kề B) ⇒Đưa Y ( C ) vào Stack; ⇒Loại bỏ cạnh (B,C) ⇒Ke(B)= {E} ⇒Ke( C) = { D} Bước lặp 2: X = C ; ( C đỉnh Stack) Kiểm tra Ke(X) tức Ke(C) = {D} khác rỗng Gán Y = D ( D phần tử DS kề C) Đưa Y ( D) vào Stack; Loại bỏ cạnh (D,C) Ke(D)= {E} Ke( C) = {} Ke(B)= {E} Ke(E) = {D, B} Bước lặp 3: X = D ; ( D đỉnh Stack) Kiểm tra Ke(X) tức Ke(D) = {E} khác rỗng Gán Y = E ( E phần tử DS kề D) Đưa Y ( E) vào Stack; Loại bỏ cạnh (D,E) Ke(D)= {} Ke( C) = {} Ke(B)= {E} Ke(E) = {B} Bước lặp 4: X = E ; ( E đỉnh Stack) Kiểm tra Ke(X) tức Ke(E) = {B} khác rỗng Gán Y = B ( B phần tử DS kề E) Đưa Y ( B) vào Stack; Loại bỏ cạnh (E,B) Ke(D)= {} Ke( C) = {} Ke(B)= {} Ke(E) = {} Bước lặp 5: X = B ; ( B đỉnh Stack) Kiểm tra Ke(X) tức Ke(B) = {} rỗng loại bỏ phần tử khỏi Stack gán cho X X= B; CE = {B} Bước lặp 6: X = E; đưa E vào CE; CE= {B, E} Tương tự lấy đỉnh khỏi Stack đến rỗng ta nhận chu trình Euler CE = {B, E, D, C, B} Bài Đồ thị Hamilton 4.2 Định lý thuật tốn liệt kê tất chu trình Hamilton Định lý 4.1 (Dirak 1952) Đơn đồ thị vô hướng G với n>2 đỉnh, đỉnh có bậc khơng nhỏ n/2 đồ thị Hamilton CM: Thêm k (k số đỉnh nhỏ nhất) đỉnh vào G nối chúng với tất đỉnh G ta nhận G’ Hamilton;Ta k= 0; Thật vây, giả sử k>0; lúc ta có chu trình Hamilton G’ có dạng v p w, , v v, w thuộc G p k đỉnh vừa thêm vào; 4.2 Định lý thuật tốn liệt kê tất chu trình Hamilton Từ ta suy ra: v khơng kề với w; v kề với w ta ko cần p nữa, vi phạm điều kiện k nhỏ nhất; Hơn nữa, đỉnh w’ kề với w khơng thể liền sau đỉnh v’ kề v v → p→ w → → v’→ w’ → → v v → v’ → → w → w’ → → v 4.2 Định lý thuật tốn liệt kê tất chu trình Hamilton Từ ta suy ra: Số đỉnh đồ thị G’ không kề với w không nhỏ số đỉnh kề với v (tức n/2+k) Đồng thời số đỉnh G’ kề với w phải n/2+k Do khơng có đỉnh G’ vừa khơng kề, lại vừa kề với w, tổng số đỉnh đồ thị G’ (G’ có n+k đỉnh) khơng n+2k Mâu thuẫn thu chứng minh định lý 4.2 Định lý thuật toán liệt kê tất chu trình Hamilton Định lý 4.2 Giả sử G đồ có hướng liên thơng với n đỉnh Nếu deg+ (v) ≥ n/2, deg – (v) ≥ n/2, với ∀v G Hamilton Đồ thị đấu loại đồ thị có hướng mà hai đỉnh nối với cung Thuật tốn liệt kê tất chu trình Hamilton đồ thị void Hamilton(k) {/* liet ke cac chu trinh Hamilton thu duoc bang viec phat trien day dinh (X[1], , X[k-1]) cua thi G=(V,E) cho boi danh sach ke: Ke(v), v∈ V */ for y ∈ Ke(X[k-1]) if( (k =N+1) && (y=v0)) Ghinhan(X[1], , X[n], v0) else if (Chuaxet[y]) { X[k]=y; Chuaxet[y]=false; Hamilton(k+1); Chuaxet[y]=true; }} KIỂM TRA ĐỒ THỊ EULER Bool KtraDoThiEuler(int A[20,20], int N) { Bac=0; Book KT=true; //Ktra qua bac cua tat cac cac dinh for (int i=0; i1 No No No No No No Yes No No No No No No No No Yes No No No No No No Câu 2: a) Chứng minh G nửa Euler: Ta có: BFS(1) = 1, 4, 5, 6, 7, 10, 11, 3, 2, 8, 12, 13, = V Nên G liên thơng yếu Ta lại có: Deg+(1)= Deg-(1) = 3; Deg+(2)= Deg-(2) =2; Deg+(4)= Deg-(4) = 3; Deg+(5)= Deg-(5) = 2; Deg+(6)= Deg-(6) = 2; Deg+(7)= Deg-(7) = 2; Deg+(8)= Deg-(8) = 2; Deg+(9)= Deg-(9) = 2; Deg+(10)= Deg-(10) = 3; Deg+(11)= Deg-(11) = 2; Deg+(12)= Deg-(12) = 2; Deg+(3) - Deg-(3) = Deg-(13) - Deg+(13) = 1; G - Liên thơng yếu có Deg+(3) - Deg-(3) = Deg-(13) - Deg+(13) = 1; nên theo định lý G nửa Euler Euler b) Xây dựng thuật tốn tìm đường Euler: Thuật tốn Euler-Path : Bước (Khởi tạo): stack = ∅; CE = ∅; u =; Push(stack, u); Bước (Lặp): while (stack ≠∅) { s = Get(stacks); if (Ke(s) ≠ ∅ ){ t = < đỉnh đầu danh sách Ke(s)>; Push(stack, t); E = E \ (s, t); } else { s = Pop(stack); E =>CE; } } Bước (Trả lại kết quả): c) Kiểm nghiệm thuật toán: Đỉnh u=3 đỉnh có Deg+(3) - Deg-(3) = đỉnh đưa vào stack Trạng thái stack CE thể bảng sau: Bước 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Trạng thái stack 3, 3, 1, 3, 1, 4, 3, 1, 4, 7, 3, 1, 4, 7, 1, 3, 1, 4, 7, 1, 5, 3, 1, 4, 7, 1, 5, 2, 3, 1, 4, 7, 1, 5, 2, 1, 3, 1, 4, 7, 1, 5, 2, 1, 6, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6, 11 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6, 11, 12 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6, 11, 12, 13 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6, 11, 12, 13, 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6, 11, 12, 13, 9, 10 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6, 11, 12, 13, 9, 10, 13 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6, 11, 12, 13, 9, 10 CE ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ ∅ 13 < Đưa đỉnh sang CE ta có : CE= 13, 10, 9, 13, 12, 11, 6, 2, 3, 5, 7, 8, 9, 12, 10, 11, 4, 8, 10, 4, 6, 1, 2, 5, 1, 7, 4, 1, Lật ngược đỉnh CE ta nhận đường Euler : 3-1- 4- 7- 1- 5- 2- 1- 6- 4- 10- 8- 4- 11- 10- 12- 9- 8- 7- 5- 3- 2- 6-11- 12-13-9-10-13 Câu a) Trình bày thuật toán PRIM: Thuật toán Prim: Bước (Khởi tạo): T = φ; D(T) = 0; VT = φ; u =; V = V\u; VT = VT ∪ u; Bước (Lặp): while (V≠φ ) { ; if ( d(e) = ∞ ) { ; return (∞);} T = T∪{e}; D(T) = D(T) + d(e); V = V \s; VT = VT∪v; } Bước (Trả lại kết quả): Return( T, D(T)); b) Kiểm nghiệm thuật toán: e=(s,t)| s∈V, t∈VT có độ dài nhỏ V \v = ? VT ∪v=? T, D(T) Khởi tạo (1,6) 2,3, 4, 5, 6, 7,8,9,10,11,12,13 2, 3, 4, 5, 7,8,9,10,11,12,13 1, (1, 2) 3, 4, 5, 7,8,9,10,11,12,13 1,2, (2, 3) 4, 5, 7,8,9,10,11,12,13 1, 2, 3, (3, 4) 5, 7,8,9,10, 11, 12,13 1,2,3,4, (4, 5) 7,8,9, 10, 11, 12,13 1,2,3,4, 5, (4,8) 7, 9, 10, 11, 12,13 1,2,3,4, 5, 6, (8,9) 7, 10, 11, 12,13 1,2,3,4, 5, 6, 8, (8,10) 7, 11, 12,13 1,2,3,4, 5, 6, 8, 9, 10 (10,11) 7, 12,13 1,2,3,4, 5, 6, 8, 9, 10, 11 (10, 12) 7, 13 1,2,3,4, 5, 6, 8, 9, 10, 11, 12 (11, 13) 1,2,3,4, 5, 6, 8, 9, 10, 11, 12, 13 (7, 8) ∅ 1,2,3,4, 5, 6, 7, 8, 9, 10, 11, 12, 13 T=∅; D(T)=0 T=T∪(1, 6); D(T) = + 1= T=T∪(1, 2); D(T) = + = T=T∪(2,3); D(T) = + = T=T∪(3,4); D(T) = + = 14 T=T∪(4,5); D(T) = 14 + = 15 T=T∪(5,8); D(T) = 15 + = 20 T=T∪(8,9); D(T) = 20 + = 23 T=T∪(8,10); D(T) = 23 + = 26 T=T∪(10,11); D(T) = 26 + = 29 T=T∪(10, 12); D(T) = 29 + = 32 T=T∪(12, 13); D(T) = 32 + = 34 T=T∪(7, 8); D(T) = 34 + = 39 V = φ : kết thúc bước lặp; D(T)=58 T = {(1,2), (1, 6), (2,3), (3,4), (4, 5), (4,8), (7,8), (8,9), (8,10), (10,11), (10, 12), (11, 13)} D(T) = 39 c) Để tìm khung lớn lớn đồ thị G, bước thuật tốn PRIM chọn cạnh có trọng số lớn Kết sau: T= {(1, 5), (1, 13), (2, 3), (2, 5), (2, 6), (3, 11), (4, 7), (4, 8), (5, 7), (9, 12), (9, 13), (10, 13)} D(T)= 83 Câu a) Trình bày thuật tốn Dijkstra: THUẬT TOÁN DIJKSTRA BƯỚC KHỞI TẠO: s đỉnh xuất phát for v∈V { d[v] = A[s,v]; truoc[v] =s; } BƯỚC LẶP: While(V≠∅){ ; ; V = V\{u}; for v ∈ V { if (d[v]> d[u] +A[u,v]) { d[v] = d[u] +A[u,v]; truoc[v] = u; } } } BƯỚC TRẢ LẠI KẾT QUẢ: Return(d(s,t)); b) Kiểm nghiệm thuật toán: Bước 10 11 12 - - - - - - Tập nhãn đỉnh - Đỉnh - 10 - 11 12 - Đường ngắn từ đỉnh đến đỉnh lại: 1->2 : độ dài 1->2->3 : độ dài 1->9->5->4 : độ dài 1->9->5 : độ dài 1->9->6 : độ dài 1->9->7 : độ dài 1->9->6->8 : độ dài 1->9 : độ dài 1->9->10 : độ dài 1->9->11 : độ dài 1->12 : độ dài 1->9->2->13 : độ dài c) Tương tự câu b) có kết đường ngắn từ đỉnh đến đỉnh là: 3->6->8->4: độ dài 13 - 12 13 ... thuật toán liệt kê tất chu trình Hamilton Từ ta suy ra: Số đỉnh đồ thị G’ không kề với w không nhỏ số đỉnh kề với v (tức n/2+k) Đồng thời số đỉnh G’ kề với w phải n/2+k Do khơng có đỉnh G’ vừa không... Euler thuật toán Flor ⇒Định lý 3.1 (Euler) Đồ thị vô hướng liên thông G đồ thị Euler đỉnh G có bậc chẵn ⇒CM định lý: ⇒ĐK đủ: Nếu bậc tất đỉnh chẵn đồ thị Euler ⇒3.3 Định lý Euler thuật toán Flor... đường Euler 3.3 Định lý Euler thuật toán Flor Định lý 3.1 (Euler) Đồ thị vô hướng liên thông G đồ thị Euler đỉnh G có bậc chẵn Bổ đề 3.1 Nếu bậc đỉnh đồ thị G không nhỏ G chứa chu trình v → v1 →v2

Ngày đăng: 25/10/2018, 10:21

Tài liệu cùng người dùng

Tài liệu liên quan