Tổng hợp các bài tập, đề thi môn Toán rời rạc các năm
Trang 11.2 ĐƯỜNG ĐI, CHU TRÌNH, ĐỒ THỊ LIÊN
THÔNG
Đồ thị vô hướng liên thông là đồ thị mà giữa hai đỉnh bất kỳ luôn tồn tại đường đi đến nhau Thành phần liên thông:
Trong trường hợp đồ thị là không liên thông, nó sẽ
rã ra thành một số đồ thị con liên thông đôi một không có đỉnh chung Những đồ thị con liên thông
như vậy ta sẽ gọi là các thành phần liên thông
của đồ thị
1.2 ĐƯỜNG ĐI, CHU TRÌNH, ĐỒ THỊ LIÊN
THÔNG
ĐƯỜNG ĐI ĐỘ DÀI N TRONG ĐỒ THỊ CÓ
HƯỚNG
Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó,
n là số nguyên dương, trên đồ thị có hướng G = (V, E) là dãy x0, x1,…, xn-1, xn
trong đó u = x0, v = xn, (xi , xi+1) ∈ E, i = 0, 1, 2,…,
n-1
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cung:
(x0, x1), (x1, x2), …, (xn-1, xn)
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi Đường đi có đỉnh đầu trùng với đỉnh
cuối (tức là u = v) được gọi là chu trình Đường đi hay chu trình được gọi là đơn nếu như không có
cung nào bị lặp lại
1.2 ĐƯỜNG ĐI, CHU TRÌNH, ĐỒ THỊ LIÊN
THÔNG
Trang 2ĐƯỜNG ĐI ĐỘ DÀI N TRONG ĐỒ THỊ CÓ
HƯỚNG
Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó,
n là số nguyên dương, trên đồ thị có hướng G = (V, E) là dãy x0, x1,…, xn-1, xn
trong đó u = x0, v = xn, (xi , xi+1) ∈ E, i = 0, 1, 2,…,
n-1
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cung:
(x0, x1), (x1, x2), …, (xn-1, xn)
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi Đường đi có đỉnh đầu trùng với đỉnh
cuối (tức là u = v) được gọi là chu trình Đường đi hay chu trình được gọi là đơn nếu như không có
cung nào bị lặp lại
- Chu trình đơn trong đồ thị G đi qua mỗi cạnh của nó một lần được gọi là chu trình Euler.
- Đường đi đơn trong G đi qua mỗi cạnh của nó một lần được gọi là đường đi Euler
- Đồ thị được gọi là đồ thị Euler nếu nó có chu trình Euler, và gọi là đồ thị nửa Euler nếu nó
có đường đi Euler
Trang 33.3 Định lý Euler và thuật toán Flor
Định lý 3.1 (Euler) Đồ thị vô hướng liên thông G là
đồ thị Euler khi và chỉ khi mọi đỉnh của G đều có bậc chẵn.
Bổ đề 3.1 Nếu bậc của mỗi đỉnh của đồ thị G
không nhỏ hơn 2 thì G chứa chu trình.
v → v1 → v2 → → vi → ???
CM định lý:
ĐK cần: Nếu là đồ thị Euler thì bậc của tất cả các đỉnh đều là chẵn
Do tồn tại chu trình Euler ( chu trình đi qua các cạnh đúng một lần); mỗi lần chu trình này đi qua một đỉnh nào đó thì bậc của đỉnh tăng lên 2
⇒ Bậc của tất cả các đỉnh đều chẵn
⇒ Định lý 3.1 (Euler) Đồ thị vô hướng liên thông
G là đồ thị Euler khi và chỉ khi mọi đỉnh của G đều có bậc chẵn.
⇒ CM định lý:
Trang 4⇒ ĐK đủ: Nếu bậc của tất cả các đỉnh đều là chẵn thì đồ thị Euler
⇒ Hệ quả 3.1 Đồ thị vô hướng liên thông G là nửa Euler khi và chỉ khi nó có không quá 2 đỉnh bậc lẻ
⇒ Thuật toán Flor để liệt kê chu trình Euler
⇒ Xuất phát từ một đỉnh nào đó, lần lượt đi qua các cạnh của đồ thị và chỉ đi qua cạnh cầu khi không còn lựa chọn nào khác;
⇒ Hệ quả 3.1 Đồ thị vô hướng liên thông G là nửa Euler khi và chỉ khi nó có không quá 2 đỉnh bậc lẻ
⇒ Thuật toán Flor để liệt kê chu trình Euler
CE là tập các cạnh của chu trình
STACK
⇒ if (Ke(x)!= ∅ )
Ke(x);
Trang 5⇒ Ke(x)=Ke(x)\ { y} ; Ke(y)=Ke(y)\{ x} ;
⇒ 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 ; ( do B là đỉnh của Stack)
⇒ Kiểm tra Ke(X) tức là Ke(B) = {C, E} khác rỗng
⇒ Gán Y = C ( do C là phần tử đầu tiên trong DS
kề của B)
⇒ Đưa Y ( C ) vào Stack;
⇒ Loại bỏ cạnh (B,C)
Bước lặp 2:
X = C ; ( do C là đỉnh của Stack)
Kiểm tra Ke(X) tức là Ke(C) = {D} khác rỗng
Gán Y = D ( do D là phần tử đầu tiên trong DS
kề của C)
Đưa Y ( D) vào Stack;
Trang 6Loạ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 ; ( do D là đỉnh của Stack)
Kiểm tra Ke(X) tức là Ke(D) = {E} khác rỗng Gán Y = E ( do E là phần tử đầu tiên trong DS
kề của 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 ; ( do E là đỉnh của Stack)
Kiểm tra Ke(X) tức là Ke(E) = {B} khác rỗng Gán Y = B ( do B là phần tử đầu tiên trong DS
kề của 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 ; ( do B là đỉnh của Stack)
Kiểm tra Ke(X) tức là Ke(B) = {} rỗng
Trang 7loại bỏ 1 phần tử ra 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ần lượt lấy các đỉnh ra khỏi Stack đến khi rỗng ta nhận được chu trình Euler
CE = {B, E, D, C, B}
Trang 8Bài 4 Đồ thị Hamilton
4.2 Định lý và thuật toán liệt kê tất cả các chu trình Hamilton
Định lý 4.1 (Dirak 1952) Đơn đồ thị vô hướng
G với n>2 đỉnh, mỗi đỉnh có bậc không nhỏ hơn n/2 là đồ thị Hamilton.
CM: Thêm k (k là số đỉnh nhỏ nhất) đỉnh mới
vào G và nối chúng với tất cả các đỉnh của G ta nhận được G’ là Hamilton;Ta sẽ chỉ ra k= 0;
Thật vây, giả sử k>0; lúc đó ta có một chu trình Hamilton trong G’ có dạng v p w, , v trong đó v,
w thuộc G và p là một trong k đỉnh vừa thêm vào;
4.2 Định lý và thuật toán liệt kê tất cả các chu trình Hamilton
Từ đó ta suy ra: v không kề với w; vì nếu v kề với w thì ta ko cần p nữa, như vậy vi phạm điều kiện k nhỏ nhất;
Hơn nữa, một đỉnh w’ là kề với w thì không thể
đi liền sau đỉnh v’ là kề của v.
v → p → w → → v’ → w’ → → v
v → v’ → → w → w’ → → v
4.2 Định lý và thuật toán liệt kê tất cả các chu trình Hamilton
Từ đó ta suy ra:
Số đỉnh của đồ thị G’ không kề với w là không nhỏ hơn số đỉnh kề với v (tức là ít nhất cũng là
bằng n/2+k)
Trang 9Đồng thời số đỉnh của G’ kề với w ít ra là phải
bằng n/2+k
Do không có đỉnh nào của G’ vừa không kề, lại vừa kề với w, cho nên tổng số đỉnh của đồ thị G’ (G’ có n+k đỉnh) không ít hơn n+2k
Mâu thuẫn thu được đã chứng minh định lý 4.2 Định lý và thuật toán liệt kê tất cả các chu trình Hamilton
Định lý 4.2 Giả sử G là đồ có hướng liên thông
với n đỉnh
Nếu deg+ (v) ≥ n/2, deg – (v) ≥ n/2, với ∀ v thì G
là Hamilton.
Đồ thị đấu loại là đồ thị có hướng mà trong đó
hai đỉnh bất kỳ của nó được nối với nhau bởi đúng một cung
Thuật toán liệt kê tất cả các chu trình
Hamilton của đồ thị
void Hamilton(k)
{/* liet ke cac chu trinh Hamilton thu duoc bang
viec phat trien day dinh (X[1], , X[k-1]) cua do 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;
Trang 10KIỂ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; i<N;i++)
{ for(int j=0;j<N;j++)
if(A[i,j] != 0) bac++;
if( bac%2==1 ) // bac cua dinh phai chan
return false;
}return true;
}
Trang 11ĐÁP ÁN ĐỀ 1 Câu 1.
a) Trình bày thuật toán BFS(u) :
Thuật toán BFS(u):
Bước 1 (Khởi tạo):
Bước 2 (Lặp):
s = Pop(Queue); <Thăm đỉnh s>;
if ( Chuaxet[t] ) {
Push(Queue, t); Chuaxet[t] = False;
} }
} Bước 3 (Trả lại kết quả) :
Return (<Tập đỉnh đã thăm>) ;
b) Tìm các đỉnh trụ của đồ thị:
liên thông (SOLT) của đồ thị là 1
Từ đây ta có kết luận: đỉnh 3, 5, 9, 10 là trụ
Trang 12c) Tìm các cạnh cầu của đồ thị:
Phương pháp được tiến hành như trong bảng sau Chú ý, thứ tự các đỉnh được duyệt theo thuật toán là quan trọng:
Từ đây ta có kết luận: cạnh (3,5), (9,10) là cầu
Trang 13Câu 2:
a) Chứng minh G là nửa Euler:
Ta có:
BFS(1) = 1, 4, 5, 6, 7, 10, 11, 3, 2, 8, 12, 13, 9 = V Nên G liên thông yếu
Ta lại có:
định lý G là nửa Euler nhưng không phải là Euler
b) Xây dựng thuật toán tìm một đường đi Euler:
Thuật toán Euler-Path :
Bước 1 (Khởi tạo):
Bước 2 (Lặp):
s = Get(stacks);
t = < đỉnh đầu trong danh sách Ke(s)>;
Push(stack, t); E = E \ (s, t);
} else {
s = Pop(stack); E =>CE;
} }
Bước 3 (Trả lại kết quả):
<Lật ngược lại các đỉnh trong CE ta nhận được đường đi Euler>
Trang 14c) Kiểm nghiệm thuật toán:
thái của stack và CE được thể hiện trong bảng sau:
14 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11 ∅
15 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10 ∅
16 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12 ∅
17 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9 ∅
18 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8 ∅
19 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7 ∅
20 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5 ∅
21 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3 ∅
22 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2 ∅
23 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6 ∅
24 3, 1, 4, 7, 1, 5, 2, 1, 6, 4, 10, 8, 4,11, 10,12, 9, 8, 7, 5, 3, 2, 6, 11 ∅
25 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 ∅
26 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 ∅
27 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 ∅
28 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 ∅
29 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 ∅
30 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
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, 3
Lật ngược các đỉnh trong CE ta nhận được đường đi 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
Trang 15Câu 3
a) Trình bày thuật toán PRIM:
Thuật toán Prim:
Bước 1 (Khởi tạo):
Bước 2 (Lặp):
}
Bước 3 (Trả lại kết quả):
Return( T, D(T));
b) Kiểm nghiệm thuật toán:
e=(s,t)|
có độ dài
nhỏ nhất
Khởi tạo 2,3, 4, 5, 6, 7,8,9,10,11,12,13 1 T= ∅ ; D(T)=0 (1,6) 2, 3, 4, 5, 7,8,9,10,11,12,13 1, 6 T=T ∪ (1, 6);
D(T) = 0 + 1= 1 (1, 2) 3, 4, 5, 7,8,9,10,11,12,13 1,2, 6 T=T ∪ (1, 2);
D(T) = 1 + 2 = 3 (2, 3) 4, 5, 7,8,9,10,11,12,13 1, 2, 3, 6 T=T ∪ (2,3);
D(T) = 3 + 6 = 9 (3, 4) 5, 7,8,9,10, 11, 12,13 1,2,3,4, 6 T=T ∪ (3,4);
D(T) = 9 + 5 = 14 (4, 5) 7,8,9, 10, 11, 12,13 1,2,3,4, 5, 6 T=T ∪ (4,5);
D(T) = 14 + 1 = 15 (4,8) 7, 9, 10, 11, 12,13 1,2,3,4, 5, 6, 8 T=T ∪ (5,8);
D(T) = 15 + 5 = 20 (8,9) 7, 10, 11, 12,13 1,2,3,4, 5, 6, 8, 9 T=T ∪ (8,9);
D(T) = 20 + 3 = 23 (8,10) 7, 11, 12,13 1,2,3,4, 5, 6, 8, 9, 10 T=T ∪ (8,10);
D(T) = 23 + 3 = 26 (10,11) 7, 12,13 1,2,3,4, 5, 6, 8, 9, 10, 11 T=T ∪ (10,11);
D(T) = 26 + 3 = 29 (10, 12) 7, 13 1,2,3,4, 5, 6, 8, 9, 10, 11, 12 T=T ∪ (10, 12);
D(T) = 29 + 3 = 32 (11, 13) 7 1,2,3,4, 5, 6, 8, 9, 10, 11, 12, 13 T=T ∪ (12, 13);
D(T) = 32 + 2 = 34 (7, 8) ∅ 1,2,3,4, 5, 6, 7, 8, 9, 10, 11, 12, 13 T=T ∪ (7, 8);
D(T) = 34 + 5 = 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)}
Trang 16D(T) = 39
c) Để tìm cây khung lớn nhất lớn nhất của đồ thị G, tại mỗi bước của thuật toán PRIM chọn cạnh có trọng số lớn nhất Kết quả như 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
Trang 17Câu 4.
a) Trình bày thuật toán Dijkstra:
THUẬT TOÁN DIJKSTRA
BƯỚC KHỞI TẠO: s là đỉnh xuất phát
d[v] = A[s,v]; truoc[v] =s;
}
BƯỚC LẶP:
<Chọn u là đỉnh có d[u] nhỏ nhất>;
<Cố định nhãn của đỉnh u>; V = V\{u};
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:
1 <0,1> <4.1> <9,1> < ∞ ,1> < ∞ ,1> <3,1> < ∞ ,1> < ∞ ,1> <1,1> < ∞ ,1> < ∞ ,1> <5,1> < ∞ ,1> 1
2 - <4,1> <4,9> < ∞ ,1> < ∞ ,1> <5,9> <3,9> < ∞ ,1> - <5,9> <6,9> <5,1> < ∞ ,1> 9
3 - <4,91> <6,7 > <10,2 > <8,2> <5,9> - <7, 7> - <5,9> <6,9> <5,1> <5,2> 2
4 - - <6,2 > <6, 5 > <5,7> <5,9> - <7, 7> - <5,9> <6,9> <5,1> <5,2> 7
5 - - <6,2 > <6,5> - <5,9> - <7, 7> - <5,9> <6,9> <5,1> <5,2> 5
6 - - <6,2 > <6,5> - - - <6, 6> - <5,9> <6,9> <5,1> <5,2> 6
7 - - <6,2 > <6,5> - - - <6, 6> - - <6,9> <5,1> <5,2> 12
8 - - <6,2 > <6,5> - - - <6, 6> - - <6,9> - <5,2> 13
9 - - <6,2 > <6,5> - - - <6, 6> - - <6,9> - - 3
Đường đi ngắn nhất từ đỉnh 1 đến các đỉnh còn lại:
1->9->5->4 : độ dài 6
1->9->6->8 : độ dài 6
1->9->2->13 : độ dài 5
c) Tương tự câu b) có kết quả đường đi ngắn nhất từ đỉnh 3 đến đỉnh 4 là:
3->6->8->4: độ dài 4