Một số bài toán về đường đi trong lí thuyết đồ thị
Trang 1Lời Mở Đầu
Lý thuyết đồ thị là một lĩnh vực đó cú từ lõu và cú nhiều ứng dụng hiệnđại Những tư tưởng cơ bản của lý thuyết đồ thị được đề xuất vào những nămđầu của thế kỷ 18 bởi nhà toỏn học lỗi lạc người Thụy Sỹ Lenhard Euler Đồthị được sử dụng để giải cỏc bài toỏn trong nhiều lĩnh lực khỏc nhau Chẳnghạn , đồ thị cú thể sử để xỏc định mạch vũng trong vấn đề giải tớch mạch điện
Đồ thị cú trọng số trờn cỏc cạnh cú thể sử dụng để giải cỏc bài toỏn như: Tỡmđường đi ngắn nhất giữa hai thành phố trong mạnh giao thụng Chỳng ta cũngcũn sử dụng đồ thị để giải cỏc bài toỏn về lập lịch , thời khoa biểu…
Đặc biệt trong khoảng vài mơi năm trở lại đây, cùng với sự ra đời của máy tính điện tử và sự phát triển nhanh chóng của tin học, lí thuyến đồ thị càng đợc quan tâm đến nhiều hơn Các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau nh: Mạng máy tính, Lí thuyết mã, Tối u hoá…
Trong phạm vi đề tài này do thời gian cú hạn chỳng em chỉ nghiên cứu
về một số bài toán về đường đi trong lí thuyết đồ thị nh: Bài toán tìm chu trìnhEuler, Bài toán tìm đờng đi ngắn nhất , Thuật toán Dijkstral Chỳng em rấtmong được sự đúng gúp ý kiến của thầy cụ và cỏc bạn
Chúng em đặc biệt bày tỏ lòng biết ơn chân thành tới thầy giáo, Tiến sĩ:Nguyễn Trung Hũa, ngời thầy đã tạo mọi điều kiện và luôn giúp đỡ, hớng dẫnchúng em tận tình để chúng em hoàn thành tốt đề tài này
Nhúm sinh viờn thực hiện:
Lờ Thị Thu HiềnNguyễn Thị Thảo Trịnh Thị ThủyNguyễn Trọng Tài
Trang 2V gọi là tập các đỉnh (Vertices) và E gọi là tập các cạnh (Edges) Có
thể coi E là tập các cặp (u, v), với u và v là hai đỉnh của V
Có thể phân loại đồ thị theo đặc tính và số lượng của tập các cạnh E:
Cho đồ thị G = (V, E) Định nghĩa một cách hình thức
1 G được gọi là đơn đồ thị nếu giữa hai đỉnh u, v của V có nhiều nhất là 1
cạnh trong E nối từ u tới v
2 G được gọi là đa đồ thị nếu giữa hai đỉnh u, v của V có thể có nhiều hơn
1 cạnh trong E nối từ u tới v (Hiển nhiên đơn đồ thị cũng là đa đồ thị)
3 G được gọi là đồ thị vô hướng nếu các cạnh trong E là không định
hướng, tức là cạnh nối hai đỉnh u, v bất kỳ cũng là cạnh nối hai đỉnh v, u.Hay nói cách khác, tập E gồm các cặp (u, v) không tính thứ tự
(u, v)≡(v, u)
4 G được gọi là đồ thị có hướng nếu các cạnh trong E là có định hướng, có
thể có cạnh nối từ đỉnh u tới đỉnh v nhưng chưa chắc đã có cạnh nối từđỉnh v tới đỉnh u Hay nói cách khác, tập E gồm các cặp (u, v) có tính thứ
tự: (u, v) ≠ (v, u) Trong đồ thị có hướng, các cạnh được gọi là các cung.
Đồ thị vô hướng cũng có thể coi là đồ thị có hướng nếu như ta coi cạnhnối hai đỉnh u, v bất kỳ tương đương với hai cung (u, v) và (v, u)
Trang 3II Các khái niệm
1 Các khái niệm cơ bản
- Khuyên: cạnh (cung) e gọi là khuyên nếu e có dạng (v,v).
- Cạnh (cung) lặp: là hai cạnh (cung) cùng tương ứng với một cặp đỉnh.
- Đỉnh kề: nếu (u,v) là cạnh (hoặc cung) của đồ thị thì v gọi là kề của u.
Trong đồ thị vô hướng nếu v kề u thì u cũng kề v, nhưng trong đồ thị cóhướng thì không chắc
- Cạnh liên thuộc: Trong đồ thị vô hướng, cạnh e=(u,v) gọi là cạnh liên
thuộc với đỉnh u và liên thuộc với đỉnh v
- Bậc của đỉnh: Trong đồ thị vô hướng, số cạnh liên thuộc với v gọi là bậc
của đỉnh v, kí hiệu là deg(v)
Ví dụ: Xét đồ thị hình 1,deg(a)=1, deg(b)=deg(c)=4, deg(d)=1,
Hình 1.2: Đồ thị có hướng
Trang 4- Cung vào, ra: Trong đồ thị có hướng, cung e=(u,v) gọi là cung ra khỏi u và
là cung vào v
- Bán bậc của đỉnh: Trong đồ thị có hướng, số cung vào v gọi là bán bậc vào
của đỉnh v, kí hiệu là: deg-(v), số cung ra khỏi v gọi là bán bậc ra của đỉnh
v, kí hiệu là: deg+(v)
Ví dụ: Xét đồ thị hình 1.1,
deg-(A)=2, deg-(B)=3, deg-(C)=1, deg-(D)=2, deg-(E)=2
deg+(A)=3, deg+(B)=2, deg+(C)=2, deg+(D)=2, deg+(E)=1
- Định lý 1 : Trong đồ thị vô hướng thì tổng bậc của tất cả các đỉnh bằng 2
lần số cạnh
V v
v)
O v
v)
deg( chẵn
Do vO, deg(v) lẻ mà tổng
O v
v)
deg( chẵn, nên tổng này phải gồmmột số chẵn các số hạng
số đỉnh có bậc là số lẻ là một số chẵn (đpcm)
- Định lý 2 : Trong đồ thị có hướng, tổng bán bậc ra của tất cả các đỉnh bằng
tổng bán bậc vào của tất cả các đỉnh và bằng số cạnh của đồ thị
Trang 52 Cách biểu diễn đồ thị trong máy tính
* Tính chất của ma trận kề của đồ thị vô hướng:
- Tính đối xứng: a[i,j]=a[j,i], i,j=1,2, .,n
Trang 6- Tổng các phần từ trên dòng i (cột j) bằng bậc của đỉnh i (đỉnh j).
- Gọi aịjp , i,j=1, 2, ,n là phần tử của ma trận Ap =A.A .A (p thừa số)Khi đó: aịjp , i,j=1, 2, ,n là số đường đi khác nhau từ đỉnh i đến đỉnh j quap-1 đỉnh trung gian
- Không có tính đối xứng
- Tổng các phần từ trên dòng i bằng bán bậc ra của đỉnh i và tổng các phần
từ trên cột j bằng bán bậc vào của đỉnh j
- Giống tính chất 3 của vô hướng
* Ma trận kề của đa đồ thị: a[i,j]=số cạnh (cung) nối hai đỉnh i, j
Ma trận trọng số:
Đồ thị có trọng số là đồ thị mà mỗi cạnh (i,j) có một giá trị c(i,j) gọi là trọng
số của cạnh Để biểu diễn đồ thị ta sử dụng ma trận trọng số C= {c[i,j], i,j=1,2, .,n}
với c[i,j]=c(i,j) nếu (i,j) E và c[i,j]= nếu (i,j) E
trong đó số có thể được đặt bằng một trong các giá trị sau: 0, + , -
Ưu điểm lớn nhất của phương pháp biểu diễn đồ thị bằng ma trận kề (hoặc
ma trận trọng số) là để trả lời câu hỏi: Hai đỉnh u,v có kề nhau trên đồ thị haykhông, chúng ta chỉ phải thực hiện một phép so sánh nhược điểm lớn nhất củaphương pháp này là: không phụ thuộc vào số cạnh của đồ thị, ta luôn phải sửdụng n2 đơn vị bộ nhớ để lưu trữ ma trận kề của nó
b Ma trận liên thuộc đỉnh-cạnh
Xét G=(V, E) là đơn đồ thị có hướng Ma trận liên thuộc đỉnh-cạnh có dạng:
Ví dụ:
1, nếu i là đỉnh đầu của cung ej
-1, nếu i là đỉnh cuối của cung ej
0, nếu i không là đầu mút của cung
Trang 7Hinh 2.2
c Danh sách cạnh (cung)
Trong trường hợp đồ thị thưa (đồ thị có số cạnh m thoả mãn bất dẳng thức:m<6n) người ta thường dùng cách biểu diễn đồ thị dưới dạng danh sách cạnh.Chúng ta sẽ lưu trữ danh sách tất cả các cạnh (cung) của đồ thị Một cạnh(cung) e=(x,y) của đồ thị sẽ tương ứng với hai biến Dau[e], Cuoi[e] Như vậy,
để lưu trữ đồ thị ta cần sử dụng 2m đơn vị bộ nhớ Nhược điểm của cách biểudiễn này tìm các đỉnh kề với một đỉnh cho trước chúng ta phải làm cỡ m phép
so sánh (khi duyệt qua danh sách tất cả các cạnh của đồ thị) Trong trường hợp
đồ thị có trọng số ta cần thêm m đơn vị bộ nhớ để lưu trữ trọng số của cáccạnh
Trang 9Trong cỏch biểu diễn này chỳng ta cần phải sử dụng cỡ m+n đơn vị bộ nhớ.
III Đường đi trong đồ thị
Chú ý rằng đờng đi trong đồ thị có hớng không đợc đi ngợc chiều mũi tên
- Đờng đi (chu trình) đợc gọi là đơn nếu nó đi qua mỗi cạnh không quá mộtlần
- Đờng đi (chu trình) đợc gọi là sơ cấp nếu nó đi qua mỗi đỉnh đúng một lần
Đờng đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dơng, trên đồ thị vô hớng G=(V,E) là dãy:
Trang 10Đỉnh u đợc gọi là đỉnh đầu, còn đỉnh v đợc 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 trùng với v) đợc gọi là chutrình Đờng đi hay chu trình đợc gọi là đơn nếu không có cạnh nào bị lặp lại
Hỡnh2.3
Khái niệm đờng đi và chu trình trên đồ thị có hớng đợc định nghĩa hoàntoàn tơng tự nh trờng hợp đồ thị vô hớng, chỉ khác là ta có chú ý đến
hớng trên các cung
4 Đờng đi và chu trình của đồ thị có hớng:
Đờng đi có độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên dơng,trên đồ thị có hớng là dãy:
Đỉnh u đợc gọi là đỉnh đầu, còn đỉnh v đợc 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 trùng với v) đợc gọi là chutrình Đờng đi hay chu trình đợc gọi là đơn nếu không có cạnh nào bị lặp lại
5 Đồ thị liên thông
Cho đồ thị G = <V,E> Hai đỉnh phân biệt u,v V đợc gọi là liên thông nếutồn tại một đờng đi nối các đỉnh u,v với nhau Đồ thị G đợc gọi là liên thôngnếu với hai đỉnh phân biệt bất kỳ trong đồ thị đều là liên thông
Ví dụ nh hình 2.3 là một đồ thị liên thông vì luôn có đờng đi nối hai đỉnh bất
kỳ của đồ thị, còn đồ thị nh hình 2 là không liên thông vì không có đờng đi từ
A tới D hoặc từ D tới F v.v
Trang 11E = E1 E2Thì G = <V,E> là đồ thị có 2 thành phần liên thông G1, G2.
Hình 2.4
Ví dụ nh đồ thị trong hình 2.4 có ba thành phần liên thông sau:
G1 = <V1, E1> với V1= {A,B,C} và E1 = {AB, AC, CB}
- G là liên thông một chiều nếu với hai đỉnh u,v khác nhau bất kỳ của G luôn
có đờng đi u - v hoặc đờng đi v - u.
- G là liên thông mạnh (liên thông 2 chiều) nếu hai đỉnh u,v khác nhau bất kỳ
của G đều có đờng đi u - v và đờng đi v - u.
Hình 2.5
Trờn hình 2.5 đồ thị H1 là liên thông mạnh, giả sử cặp đỉnh (A,C) ta có chiều
đi từ C tới A, và đồng thời cũng có chiều đi từ A tới C, và bất kỳ các cặp đỉnhkhác cũng tơng tự nh vậy H2 là liên thông một chiều vì xét cặp đỉnh (A,D) cóchiều đi từ D tới A nhng không có chiều đi từ A tới D H3 là liên thông yếu vìtồn tại cặp đỉnh (B,C) không có chiều đi B - C cũng không có chiều đi C - B, nh -
ng đồ thị vô hớng tơng ứng là liên thông
6 Đường đi Euler và chu trinh Euler
Đường đi Euler: Một đường đi trong đồ thị được gọi là đường đi euler nếu
nú đi qua tất cả cỏc cạnh hoặc cung của đồ thị với mỗi cạnh hoặc cung đi quađỳng một lần
F
C
ED
Trang 12Chu trình Euler: Một chu trình được gọi là chu trình Euler nếu nó là một
đường đi Euler
Đường đi Euler là một đường đi đơn chứa tất cả các cạnh hoặc cung của đồ
thị Còn chu trình Euler là một chu trinh đơn chứa tất cả các cạnh hoặc cung
của đồ thị
Một đồ thị có đường đi Euler thì được gọi là đồ thị nửa Euler.Còn đồ thị có
chu trình Euler thì gọi là đồ thị Euler
a, Điều kiện cần và đủ để một đồ thị vô hướng liên thông có chu trình
Euler là mọi đỉnh của nó đều có bậc chẵn
b, Điều kiện cần và đủ để đồ thị có hướng liên thông mạnh có chu trình
Euler là tại mọi đỉnh của nó thì bậc vào bằng bậc ra có nghĩa là:
Deg -(v)=Deg +(v) vV;
Định lý 2 Cần và đủ để 1 đồ thị có đường đi Euler nhưng không có chu trình
Euler là đồ thị đó có đúng 2 đỉnh bậc lẻ
7 Bài toán đường đi ngắn nhất
Trong lý thuyết đồ thị, bài toán đường đi ngắn nhất nguồn đơn là bài
toán tìm một đường đi giữa hai đỉnh sao cho tổng các trọng số của các cạnh
tạo nên đường đi đó là nhỏ nhất Định nghĩa một cách hình thức, cho trước
B
A
C
D E
A
E
D F
B
C
Trang 13một đồ thị có trọng số (nghĩa là một tập đỉnh V, một tập cạnh E, và một hàmtrong số có giá trị thực f : E → R), cho trước một đỉnh v thuộc V, tìm mộtđường đi P từ v tới mỗi đỉnh v' thuộc V sao cho:
là nhỏ nhất trong tất cả các đường nối từ v tới v' Bài toán đường đi ngắn nhất
giữa mọi cặp đỉnh là một bài toán tương tự, trong đó ta phải tìm các đường đi
ngắn nhất cho mọi cặp đỉnh v và v'
Thuật toán Dijkstra, mang tên của nhà khoa học máy tính người Hà Lan
Edsger Dijkstra, là một thuật toán giải quyết bài toán đường đi ngắn nhất
nguồn đơn trong một đồ thị có hướng không có cạnh mang trọng số âm
Bài toán:
Cho một đồ thị có hướng G=(V,E), một hàm trọng số w: E → [0, ∞) vàmột đỉnh nguồn s Cần tính toán được đường đi ngắn nhất từ đỉnh nguồn s đếnmỗi đỉnh của đồ thị
Ví dụ: Chúng ta dùng các đỉnh của đồ thị để mô hình các thành phố và
các cạnh để mô hình các đường nối giữa chúng Khi đó trọng số các cạnh cóthể xem như độ dài của các con đường (và do đó là không âm) Chúng ta cầnvận chuyển từ thành phố s đến thành phố t Thuật toán Dijkstra sẽ giúp chỉ rađường đi ngắn nhất chúng ta có thể đi
Trọng số không âm của các cạnh của đồ thị mang tính tổng quát hơnkhoảng cách hình học giữa hai đỉnh đầu mút của chúng
Ví dụ: Với 3 đỉnh A, B, C đường đi A-B-C có thể ngắn hơn so với
đường đi trực tiếp A-C
Thuật toán Dijkstra có thể mô tả như sau:
- Ta quản lý một tập hợp động S Ban đầu S={s}
- Với mỗi đỉnh v, chúng ta quản lý một nhãn d[v] là độ dài bé nhất trongcác đường đi từ nguồn s đến một đỉnh u nào đó thuộc S, rồi đi theo cạnh nối u-v
- Trong các đỉnh ngoài S, chúng ta chọn đỉnh u có nhãn d[u] bé nhất, bổsung vào tập S Tập S được mở rộng thêm một đỉnh, khi đó chúng ta cần cậpnhật lại các nhãn d cho phù hợp với định nghĩa
Trang 14- Thuật toỏn kết thỳc khi toàn bộ cỏc đỉnh đó nằm trong tập S, hoặc nếuchỉ cần tỡm đường đi ngắn nhất đến một đỉnh đớch t, thỡ chỳng ta dừng lại khiđỉnh t được bổ sung vào tập S.
Tớnh chất khụng õm của trọng số cỏc cạnh liờn quan chặt chẽ đến tớnhđỳng đắn của thuật toỏn Khi chứng minh tớnh đỳng đắn của thuật toỏn, chỳng
ta phải dựng đến tớnh chất này
Phần 2: Cài Đặt Thuật Toỏn
I Kiểm tra tính liên thông:
Một đồ thị đợc gọi là liên thông nếu mọi cặp đỉnh của nó đều đợc nốivới nhau bởi một đờng
Một đồ thị con liên thông của đồ thị mà nó không đợc chứa trong một
đồ thị con liên thông khác, gọi là thành phần liên thông
1 Bài toán:
Bài toán đặt ra là cho một đồ thị vô hớng G=(V,E), hãy cho
biết G có bao nhiêu thành phần liên thông, và mỗi thành phần liên thông của
nó gồm những đỉnh nào
2 Thuật toán kiểm tra tính liên thông :
Xét đồ thị G(V,E):
B ớc 1 : Lấy đỉnh bất kỳ I của G, đặt T={ I } và gọi I là đỉnh gốc
B ớc 2 : Đa vào T tất cả những đỉnh j sao cho cạnh ij thuộc E ( tức cạnh ij làmột cạnh của G)
B ớc 3 : Nếu T chứa mọi đỉnh của G( nghĩa là điều kiện dừng lại ở bớc 2thoả mãn), thì đồ thị G liên thông
B ớc 4 : Nếu T không chứa mọi đỉnh của G thì đồ thị G không liên thông.Khi đó, T là một thành phần của liên thông
B ớc 5 : Lấy đỉnh v thuộc G nhng không thuộc T, trở về bớc 2
II Tìm chu trình Euler:
Trang 15Định nghĩa chu trình Euler : Giả sử G<X,U> là đồ thị vô hớng Một chutrình w trong đồ thị G đợc gọi là chu trình Euler nếu nó đi qua tất cả các cạnhcủa G và đi qua mỗi cạnh đúng một lần.
1 Nêu bài toán :
Cho đồ thị G=<X,U> Hãy tìm chu trình Euler của đồ thị G nếu có
2 Nêu thuật toán :
Cho đơn đồ thị G với ma trận kề a[i,j]
B
ớc 1 : Kiểm tra xem bậc của mỗi đỉnh có là số chẵn hay không, tức làkiểm tra xem tổng các phần tử trên mỗi dòng ( hoặc mỗi cột) có là số chẵn haykhông?
B
ớc 2 : Nếu tồn tại một đỉnh có bậc lẻ (hoặc một dòng hay một cột của
ma trân có tổng các phần tử của nó là lẻ), ta kết luận rằng đồ thị không có chutrình Euler
B
ớc 5 : Kiểm tra xem có còn đỉnh nào có cạnh liên thuộc với nó mà cha
đ-ợc đi qua hay không? Nếu có, ta lấy đỉnh đó làm xuất phát (đỉnh dớnh), đi theochu trình cũ, hoàn tất chu trình tại đỉnh này rồi đi theo cạnh cha đợc đi qua.Trở về bớc4
B
ớc 6: Nếu không có đỉnh nào còn có cạnh liên thuộc với nó mà cha đợc
đi qua, thỡ ta ghộp chu trỡnh với chu trỡnh con tại đỉnh dớnh và coi chu trỡnhmới thu được bằng chu trỡnh Ta kết luận chu trỡnh tim được là chu trỡnh Euler
3.Vớ dụ minh họa
Trang 164 Cài đặt thuật toán
begin
write('Cho so dinh cua do thi:');readln(n);
writeln('Nhap so lieu ma tran ke:');
Trang 20{*******************Ghep chu trinh*****************}
Procedure ghep(var ct:bvtor; ctc:bvtor;i:byte);
writeln('Khong co chu trinh');
write('An enter de tiep tuc ');readln;
Trang 21writeln('So thanh phan cua do thi lien thong la:',solt);
for i:=1 to solt do
begin
Trang 22writeln('Thanh phan lien thong thu ',i,' gom cac dinh:');
Trang 23write('Tim duong di tu dinh:');readln(s);
write(' den dinh:');readln(T);
for j:= 1 to n do
Trang 24writeln('TIM DUONG DI VA KIEM TRA TINH LIEN THONG');
WRITELN('CUA DO THI THEO THUAT TOAN TIM KIEM TREN DO THI');
writeln('Moi ban chon chuc nang:');
writeln;
writeln('1.Nhap so lieu tu ban phim');
writeln('2.Nhap so lieu tu tep');
writeln('3.Kiem tra tinh lien thong');
writeln('4.Tim duog di giua hai dinh');