Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh này, các loại đồ thị khác nhau được phân biệt bởi kiểu và số lượng cạnh nối hai đỉnh nào đó của đồ thị. Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh này, các loại đồ thị khác nhau được phân biệt bởi kiểu và số lượng cạnh nối hai đỉnh nào đó của đồ thị.
Chơng số vấn đề đồ thị I Các định nghĩa đồ thị Định nghĩa đồ thị Đồ thị cấu trúc rời rạc bao gồm đỉnh cạnh nối đỉnh này, loại đồ thị khác đợc phân biệt kiểu số lợng cạnh nối hai đỉnh đồ thị Giả sử X tập hữu hạn, không rỗng phần tử U XìX Bộ G = đợc gọi đồ thị hữu hạn Mỗi phần tử xX gọi đỉnh phần tử u = (x,y) U gọi cạnh đồ thị G = Xét cạnh u U tồn đỉnh x, y X cho u = (x, y), ta nói x nối với y x y thuộc u x u y - Nếu cạnh u = (x, y) mà x y hai đỉnh phân biệt ta nói x, y hai đỉnh kề - Nếu u = (x, x) u cạnh có hai đỉnh trùng ta gọi khuyên - Nếu u = (x, y) mà x,y cặp đỉnh có phân biệt thứ tự hay có hớng từ x đến y u cung, x gốc y x đỉnh ra, y đỉnh vào - Khi cặp đỉnh (x, y) có nhiều cạnh ta nói cạnh cặp đỉnh cạnh song song cạnh bội y x y x y a) b) c) a Tại đỉnh y có khuyên b Một cung có hớng từ x sang y c Cặp đỉnh (x, y) có cạnh song song Hình 1.1 Trong thực tế ta gặp nhiều vấn đề mà dùng mô hình đồ thị để biểu diễn, nh sơ đồ mạng máy tính, sơ đồ mạng lới giao thông, sơ đồ thi công công trình Ví dụ: Xét mạng máy tính, biểu diễn mạng mô hình đồ thị, máy đỉnh, máy đợc nối với dây truyền, chúng tơng ứng cạnh đồ thị Một mô hình mạng máy tính nh hình 1.2 có máy tính A, B, C, D tơng ứng đỉnh, máy đợc nối trực tiếp với tơng ứng với cặp đỉnh kề A B C D Hình 1.2 Ví dụ đồ thị Đồ thị đơn Đồ thị G = đợc gọi đồ thị đơn hai đỉnh đợc nối với không cạnh (cung), tức đồ thị cạnh bội, khuyên Hình 1.2 ví dụ đồ thị đơn Đa đồ thị Đồ thị G = đợc gọi đa đồ thị có cặp đỉnh đợc nối với hai cạnh (hai cung) trở lên Giả đồ thị Là đồ thị có khuyên, chứa cạnh bội, cạnh đơn Tóm lại loại đồ thị tổng quát A B D A B C D a) Hình 1.3 a Đa đồ thị b) b Giả đồ thị II Các loại đồ thị Đồ thị vô hớng 10 C Đồ thị G= đợc gọi đồ thị vô hớng tất cạnh e U mà cặp đỉnh thuộc e = (x,y) X không phân biệt thứ tự Đồ thị vô hớng đồ thị cung Ví dụ: nh hình 1.3.a biểu diễn đồ thị vô hớng Đồ thị có hớng Đồ thị G = đợc gọi đồ thị có hớng tất cạnh e U mà cặp đỉnh thuộc e = (x, y) X có phân biệt thứ tự Đồ thị có hớng đồ thị mà e = (x, y) X cung A B C Hình 2.1 Đồ thị có hớng Đồ thị hỗn hợp Đồ thị G= vừa có cạnh vô hớng, vừa có cạnh có hớng đợc gọi đồ thị hỗn hợp, loại đồ thị đợc dùng tới Chú ý vấn đề phân chia đồ thị thuật ngữ đồ thị mang tính tơng đối, cha mang tính thống chuẩn nhiều tài liệu III Một số khái niệm tính chất đồ thị Bậc đồ thị 1.1 Bậc đồ thị vô hớng Cho đồ thị vô hớng G = Xét đỉnh x X đặt m(x) số cạnh thuộc đỉnh x m(x) đợc gọi bậc đỉnh x Nếu x có khuyên m(x) đợc cộng thêm x x m(x) = m(x) = - Nếu m(x) = đỉnh x đợc gọi đỉnh cô lập - Nếu m(x) = đỉnh x đợc gọi đỉnh treo Ta đặt m(G) = m(x) x X m(G) đợc gọi bậc đồ thị vô hớng G = 1.2 Bậc đồ thị có hớng 11 Cho đồ thị có hớng G= xét đỉnh x X, ta ký hiệu m+(x) số cung vào đỉnh x, m-(x) số cung khỏi x Khi ta gọi m +(x) bậc vào đỉnh x m-(x) bậc đỉnh x - Nếu m+(x) + m-(x) = đỉnh x đợc gọi đỉnh cô lập - Nếu m+(x) + m-(x) = đỉnh x đợc gọi đỉnh treo Ta đặt m(G) = m + (x) + x X m (x) x X Khi m(G) đợc gọi bậc đồ thị có hớng G = Trong đồ thị có hớng m+(x) = m-(x) = U Ví dụ: - Xét đồ thị vô hớng nh hình 1.3.a ta có: m(G) = m(A) + m(B) + m(C) + m(D) = + + + = 10 - Xét đồ thị có hớng hình 2.1 ta có: m(G) = [m+(A) + m+(B) + m+(C) ] + [m-(A) + m-(B) + m-(C)] = [1 + + 1] + [2 + +1] = Định lý: Cho đồ thị hữu hạn G = bậc đồ thị G lần số cạnh đồ thị, tức m(G) = 2U Chứng minh: Ta thấy cạnh thuộc đỉnh, xoá cạnh bậc G giảm 2, xoá khuyên u = (x, x) bậc G giảm 2, xoá hết cạnh, hết khuyên bậc đồ thị Từ suy định lý Hệ quả: Số đỉnh bậc lẻ đồ thị G = số chẵn Chứng minh: Gọi A B tơng ứng tập đỉnh bậc lẻ tập đỉnh bậc chẵn đồ thị Ta có: 2m = m(x) xX = m(x) + m(x) xA xB Do vế trái chẵn nên tổng vế phải số chẵn Mà tổng bậc đỉnh bậc chẵn (xA) số chẵn nên tổng bậc đỉnh bậc lẻ (x) phải số chẵn, tất số hạng số lẻ, nên tổng phải gồm số chẵn số hạng Vì số đỉnh bậc lẻ phải số chẵn đờng chu trình 2.1 Đờng 12 Xét đồ thị G = với - Tập đỉnh X = {x1,x2, ,xn} - Tập cạnh U = {u1,u2, ,um} Tập hợp đỉnh kề từ xi đến xj đợc gọi đờng đi, kí hiệu xixi1xi2 xj xiuixi1ui1xi2ui2 ujxj Trong cạnh, đỉnh đờng lặp lại Độ dài đờng số cạnh (hoặc cung) đờng *Chú ý đồ thị có hớng, cung uv chẳng hạn đờng đi từ gốc (u) đến (v) ngợc lại 2.2 Chu trình Xét đờng từ xi - xj Nếu xi xj đờng đợc gọi chu trình Nh chu trình đờng có đỉnh xuất phát đỉnh kết thúc trùng Chú ý đờng đồ thị có hớng không đợc ngợc chiều mũi tên - Đờng (chu trình) đợc gọi đơn qua cạnh không lần - Đờng (chu trình) đợc gọi sơ cấp qua đỉnh lần A B D E C Hình 3.1 Ví dụ nh hình 3.1 ADBE đờng sơ cấp từ A đến E độ dài 3; ABCDBE đờng không sơ cấp ( qua B lần) từ A đến E độ dài 5; ABDAB đờng không đơn (chứa cạnh AB lần) từ A đến B độ dài 4; ABDA Là chu trình đơn sơ cấp độ dài 3; CC đờng độ dài Xét đồ thị có hớng nh hình 2.1 ABCB đờng độ dài 3; CBA không đờng cung từ B đến A Định lý: Nếu đồ thị G = đỉnh có bậc không nhỏ ( x X | m(x) ) G tồn chu trình Chứng minh: Xét tất đờng đơn Vì đồ thị hữu hạn số đờng đơn hữu hạn Chọn đờng dài ví dụ từ xi1 đến xij +1 (xem hình vẽ dới đây) Theo giả thiết m(x) nên tồn đỉnh xi0 cạnh nối đỉnh xi1 xi0 Đỉnh xi0 thuộc đỉnh đờng chọn 13 chẳng hạn xij đờng dài nhất, nên chứng tỏ tồn chu trình đờng xi2 xi1 xi3 xij xij+1 xi0 Đồ thị liên thông Cho đồ thị G = Hai đỉnh phân biệt x,y X đợc gọi liên thông tồn đờng nối đỉnh x, y với Đồ thị G đợc gọi liên thông với hai đỉnh phân biệt đồ thị liên thông Ví dụ nh hình 3.1 đồ thị liên thông có đờng nối hai đỉnh đồ thị, đồ thị nh hình 3.2 không liên thông đờng từ A tới D từ D tới F v.v Xét đồ thị liên thông G1 = G2 = Trong đó: X1 X2 = U1 U2 = Khi đó: X = X1 X2 U = U1 U Thì G = đồ thị có thành phần liên thông G1, G2 A B C D E F Hình 3.3 Ví dụ nh đồ thị hình 3.3 có ba thành phần liên thông sau: G1 = với X1= {A,B,C} U1 = {AB, AC, CB} G2 = với X2= {D, E} U2 = {DE} G3 = với X3= {F} U3 = Cho đồ thị có hớng G = - G đợc gọi đồ thị liên thông yếu đồ thị vô hớng tơng ứng với liên thông - G liên thông chiều với hai đỉnh x,y khác G có đờng x - y đờng y - x - G liên thông mạnh (liên thông chiều) hai đỉnh x,y khác G có đờng x - y đờng y - x 14 A A B A B B D D D C C C H2 Hình 3.4 H3 H1 hình 3.4 đồ thị H1 liên thông mạnh, giả sử cặp đỉnh (A,C) ta có chiều từ C tới A, đồng thời có chiều từ A tới C, cặp đỉnh khác tơng tự nh H2 liên thông chiều xét cặp đỉnh (A,D) có chiều từ D tới A nhng chiều từ A tới D H3 liên thông yếu tồn cặp đỉnh (B,C) chiều B - C chiều C - B, nhng đồ thị vô hớng tơng ứng liên thông Đồ thị đồ thị phận Cho đồ thị G = - Nếu đồ thị ta bỏ số đỉnh cạnh xuất phát từ đỉnh phần lại đồ thị đợc gọi đồ thị đồ thị G cho, D = đồ thị G = X' X U' U - Nếu đồ thị G ta bỏ số cạnh nhng giữ nguyên đỉnh phần lại đồ thị đợc gọi đồ thị phận đồ thị G IV Các dạng biểu diễn đồ thị Biểu diễn hình học đồ thị Để có nhìn trực quan ta thờng biểu diễn đồ thị hình học, đồ thị biểu diễn mặt phẳng không gian Phơng pháp biểu diễn nh sau: Biểu diễn đỉnh đồ thị điểm (hay vòng tròn nhỏ, ô vuông nhỏ) nối hai điểm đờng (cong, thẳng, mũi tên) cặp điểm ứng với cạnh (cung) đồ thị Ví dụ 1: Cho đồ thị G = X = {A, B, C, D, E} U = {AB, AC, AD, AE, BD, CD, CE} A D C B E B E A D C a) b) Hình 4.1 15 Hình 4.1.a hình 4.1.b biểu diễn hình học đồ thị G cho Sự đẳng cấu Với đồ thị có nhiều dạng biểu diễn hình học, có nhiều đồ thị tởng chừng khác nhng cách biểu diễn hình học khác đồ thị, đẳng cấu cho phép kết luận đợc điều Định nghĩa: Xét đồ thị G1 = (X1, U1) G2 = Hai đồ thị đợc gọi đẳng cấu với tồn song ánh từ X vào X2 từ U1 vào U2 cho có cạnh e = (u, v) U1 tơng ứng với cạnh e' = (u', v') U2 cặp đỉnh u, v X1 tơng ứng cặp đỉnh u', v' X2 Ví dụ xét đồ thị G1 G2 nh hình 4.2 a b m n d c q p G1 G2 Hình 4.2 Ta có f : G1 G2 f(a) = m f(c) = n f(d) = q f(b) = p Nếu a, b X1 kề f(a), f(b) X2 kề Vậy đồ thị đẳng cấu với nhau, ta xem G G2 thực chất có điều biểu diễn dạng hình học khác nhau, tên đỉnh khác Để xét đồ thị có đẳng cấu không việc khó, nhiên để xét đồ thị không đẳng cấu với đơn giản Đối với đồ thị đẳng cấu đồ thị có tính chất bất biến nh sau: - Số đỉnh - Số cạnh - Bậc đỉnh tơng ứng nh - Ma trận kề nh - Các chu trình nh Một số đồ thị đặc biệt Do tính chất, dạng biểu diễn có nét đặc thù riêng biệt nên ta phân loại số đồ thị thành dạng đặc biệt sau: 16 3.1 Đồ thị Là đồ thị mà đỉnh có bậc, bậc k đồ thị k - a) b) c) d) Hình 4.3 a: G- đều; b: G - đều; c: G - đều; d: G - Trờng hợp riêng nh đồ thị hình 4.3.b hình 4.3.c đồ thị vòng ký hiệu Cn (n số đỉnh) 3.2 Đồ thị đầy đủ Đồ thị đầy đủ n đinh, ký hiệu K n đơn đồ thị vô hớng mà cặp đỉnh phân biệt kề Xem ví dụ nh hình 4.4 dới trờng hợp riêng đồ thị G - đồ thị đầy đủ a) b) Hình 4.4 a - đồ thị đầy đủ K2 ; b - đồ thị đầy đủ K4 3.3 Đồ thị bánh xe: Ký hiệu Wn, thu đợc từ đồ thị vòng có n đỉnh cách bổ sung đỉnh nối tất đỉnh có W4 W5 Hình 4.5 Các dạng đồ thị bánh xe W6 3.4 Một vài ứng dụng đồ thị đặc biệt mạng cục (LAN), máy tính thờng đợc kết nối theo cách thức gọi hình trạng (topolopy) Dựa theo đặc điểm totolopy 17 mà ta mô hình số dạng đồ thị đặc biệt Ví dụ với mạng LAN máy tính đợc kết nối theo topolopy hình (Star) sau đây: Hình 4.6 dạng này, tất máy đợc nối vào thiết bị trung tâm có nhiệm vụ nhận tín hiệu từ máy chuyển đến máy đích tín hiệu Từ đặc điểm mô hình đồ thị phận đồ thị bánh xe W nh hình 4.7.a a) b) c) d) a) Dạng b) dạng vòng c) dạng hỗn hợp d) dạng đầy đủ (Complete) Hình 4.7 Một số topolopy LAN mạng LAN ta thờng có dạng topolopy khác nh dạng chu trình (loop) gọi vòng dạng máy nối với máy khác Mạng cục với cấu trúc vòng tròn đợc mô hình đồ thị đặc biệt dạng vòng Cn nh hình 4.7.b, thông báo gửi từ máy sang máy khác theo chu trình vòng tròn tới đợc máy đích Hoặc dạng dạng hỗn hợp, kết hợp dạng hình hình vòng Topolopy kiểu đồ thị bánh xe Wn (hình 4.7.c) Mạng cục dạng bánh xe máy truyền vòng quanh theo vòng tròn qua phận trung tâm Ngoài ngời ta thờng hay bố trí mạng cho máy kết nối trực tiếp với nhau, với kiểu mô hình đồ thị đầy đủ Kn (hình 4.7.d) Biểu diễn đồ thị máy tính Lĩnh vực đồ thị có nhiều ứng dụng thực tế, mô hình nhiều ứng dụng đồ thị sử dụng máy tính để giải toán ứng dụng Nên việc biểu diễn lu trữ đồ thị máy tính vấn đề trọng 18 b) Danh sách kề đồ thị G2 Bộ nhớ sử dụng cho phơng pháp biểu diễn danh sách kề tỷ lệ thuận với tổng số đỉnh cạnh đồ thị Nhợc điểm cách biểu diễn thời gian cần thiết để xác định có cạnh từ đỉnh xi tới đỉnh xj có hay không O(n) Cách biểu diễn thích hợp cho thuật toán mà cấu trúc đồ thị hay thay đổi nh thêm bớt cạnh Ta dùng ma trận kề biểu diễn đồ thị G1 G2 hình 4.8 nh sau: Đối với đồ thị có trọng số cạnh e = (xi, xj) đợc gán trọng số l(e) (còn viết l(xi, xj) ) ma trận kề đợc thay ma trận có trọng số, M G1 = 1 0 M G2 1 = 1 phần tử ma trận trọng số cạnh tơng ứng: aij = l(xi, xj) Ưu điểm phơng pháp dễ dàng xác định đợc cặp đỉnh có kề hay không thuận tiện tìm số bậc đỉnh Việc truy cập phần tử ma trận kề qua số không phụ thuộc vào số đỉnh đồ thị Nhợc điểm lớn phơng pháp không phụ thuộc vào số cạnh đồ thị, ta phải sử dụng n2 đơn vị nhớ để lu trữ ma trận kề Định lý: Nếu G = đa đồ thị với A = (aij) ma trận kề tơng ứng, số đờng khác từ đỉnh xi đến đỉnh xj có độ dài s phần tử Pij ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong số hệ thống thông tin đợc mô hình đồ thị thực tốt số công tác kiểm kỹ thuật Ví dụ biểu diễn mạng máy tính đồ thị, giả sử có máy mà thông tin truyền chúng quan trọng, cần tiến hành kiểm tra xem có đờng truyền dự phòng chúng không Xét góc độ đồ thị cần kiểm tra xem số đờng cặp đỉnh tơng ứng với máy đó, số đờng lớn có đờng truyền dự phòng * Chơng trình viết PASCAL sau tính số đờng độ dài l nhập từ bàn phím Type MaTran = Array[1 20,1 20] Of Integer; Var a, b, aa: MaTran; n,l,x1,x2: Integer; Procedure InputMt(Var Mt: Matran); 23 Var i, j: Integer; Begin For i:=1 to n For j:=1 to n Begin Write('a',i,j,'= '); Readln(Mt[i,j]); End; End; Procedure Gan(Mt1: MaTran; Var Mt2: MaTran); {Mt2 < Mt1} Var i,j:Integer; Begin For i:=1 to n For j:=1 to n Mt2[i,j]:=Mt1[i,j]; End; Procedure TichMt(mt1,mt2: Matran; Var MtKq: MaTran); { MtKq = Mt1*Mt2 } Var i,j,k: Integer; Begin For i:=1 to n For j:=1 to n Begin MtKq[i,j]:=0; For k:=1 to n MtKq[i,j]:=MtKq[i,j]+Mt1[i,k]*Mt2[k,j]; End; End; Procedure LthuaMt(m: Integer); {aa = a ^m (m: dai duong di, m>=2) } Var i: Integer; Begin Gan(a,b); For i:=1 to m-1 Begin TichMt(b,a,aa); Gan(aa,b); End; End; Procedure FindWay(i,j: Integer); { Tim so duong di tu dinh i >j } Begin If aa[i,j]0 then Writeln('So duong di dai ',l,' tu x',x1,' > ','x2 ','la: ',aa[i,j]) Else Writeln('Khong co duong di tu dinh ',i,' toi dinh ',j,' voi dai ',l); End; 24 BEGIN Writeln('Nhap ma tran ke cho thi:'); Write('So dinh thi: '); Readln(n); InputMt(a); Write('Dinh xuat phat: '); Readln(x1); Write('Dinh ket thuc: '); Readln(x2); Write('Do dai duong di: '); Readln(l); LthuaMt(l); FindWay(x1,x2); END 4.2 Danh sách cạnh (cung) Cho đồ thị G = với số cạnh m, số đỉnh n Nếu m < 6n G thờng đợc biểu diễn dới dạng danh sách cạnh (cung) Theo cách danh sách tất cạnh (cung) đồ thị vô hớng (có hớng) Mỗi cạnh (cung) e = (x, y) đồ thị tơng ứng với hai biến Dau[e], Cuoi[e] 2 3 G1 G2 Hình 4.9 Ví dụ: Hình 4.9 đồ thị G1 G2 đợc biểu diễn danh sách cạnh (cung) nh sau: Dau Cuoi Dau Cuoi 2 3 3 4 4 Danh sách cạnh G1 Danh sách cung G2 Nh để lu trữ đồ thị cần sử dụng 2m đơn vị nhớ Nhợc điểm phơng pháp để xác định đỉnh đồ thị kề với đỉnh cho trớc phải làm cỡ m phép so sánh 4.3 Danh sách kề Phơng pháp biểu diễn danh sách kề đợc sử dụng phổ biến thờng hay dùng cho đồ thị có hớng 25 Danh sách kề cho đỉnh xi danh sách gồm tất đỉnh kề x i theo thứ tự đỉnh tập đỉnh X Ta biểu diễn đồ thị nh mảng FIRST, với phần tử FIRST[i] trỏ trỏ tới danh sách kề cho đỉnh xi Ví dụ: hình 4.9 đồ thị G1 G2 đợc biểu diễn danh sách kề nh sau: FIRST 3 Nil Nil Nil Nil a) Danh sách kề đồ thị G1 FIRST Nil Nil Nil Nil b) Danh sách kề đồ thị G2 Bộ nhớ sử dụng cho phơng pháp biểu diễn danh sách kề tỷ lệ thuận với tổng số đỉnh cạnh đồ thị Nhợc điểm cách biểu diễn thời gian cần thiết để xác định có cạnh từ đỉnh xi tới đỉnh xj có hay không O(n) Cách biểu diễn thích hợp cho thuật toán mà cấu trúc đồ thị hay thay đổi nh thêm bớt cạnh Ta dùng ma trận kề biểu diễn đồ thị G1 G2 hình 4.8 nh sau: Đối với đồ thị có trọng số cạnh e = (xi, xj) đợc gán trọng số l(e) (còn viết l(xi, xj) ) ma trận kề đợc thay ma trận có trọng số, M G1 = 1 0 M G2 1 = 1 phần tử ma trận trọng số cạnh tơng ứng: aij = l(xi, xj) 26 Ưu điểm phơng pháp dễ dàng xác định đợc cặp đỉnh có kề hay không thuận tiện tìm số bậc đỉnh Việc truy cập phần tử ma trận kề qua số không phụ thuộc vào số đỉnh đồ thị Nhợc điểm lớn phơng pháp không phụ thuộc vào số cạnh đồ thị, ta phải sử dụng n2 đơn vị nhớ để lu trữ ma trận kề Định lý: Nếu G = đa đồ thị với A = (aij) ma trận kề tơng ứng, số đờng khác từ đỉnh xi đến đỉnh xj có độ dài s phần tử Pij ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong số hệ thống thông tin đợc mô hình đồ thị thực tốt số công tác kiểm kỹ thuật Ví dụ biểu diễn mạng máy tính đồ thị, giả sử có máy mà thông tin truyền chúng quan trọng, cần tiến hành kiểm tra xem có đờng truyền dự phòng chúng không Xét góc độ đồ thị cần kiểm tra xem số đờng cặp đỉnh tơng ứng với máy đó, số đờng lớn có đờng truyền dự phòng * Chơng trình viết PASCAL sau tính số đờng độ dài l nhập từ bàn phím Type MaTran = Array[1 20,1 20] Of Integer; Var a, b, aa: MaTran; n,l,x1,x2: Integer; Procedure InputMt(Var Mt: Matran); Var i, j: Integer; Begin For i:=1 to n For j:=1 to n Begin Write('a',i,j,'= '); Readln(Mt[i,j]); End; End; Procedure Gan(Mt1: MaTran; Var Mt2: MaTran); {Mt2 < Mt1} Var i,j:Integer; Begin For i:=1 to n For j:=1 to n Mt2[i,j]:=Mt1[i,j]; End; Procedure TichMt(mt1,mt2: Matran; Var MtKq: MaTran); { MtKq = Mt1*Mt2 } Var i,j,k: Integer; 27 Begin For i:=1 to n For j:=1 to n Begin MtKq[i,j]:=0; For k:=1 to n MtKq[i,j]:=MtKq[i,j]+Mt1[i,k]*Mt2[k,j]; End; End; Procedure LthuaMt(m: Integer); {aa = a ^m (m: dai duong di, m>=2) } Var i: Integer; Begin Gan(a,b); For i:=1 to m-1 Begin TichMt(b,a,aa); Gan(aa,b); End; End; Procedure FindWay(i,j: Integer); { Tim so duong di tu dinh i >j } Begin If aa[i,j]0 then Writeln('So duong di dai ',l,' tu x',x1,' > ','x2 ','la: ',aa[i,j]) Else Writeln('Khong co duong di tu dinh ',i,' toi dinh ',j,' voi dai ',l); End; BEGIN Writeln('Nhap ma tran ke cho thi:'); Write('So dinh thi: '); Readln(n); InputMt(a); Write('Dinh xuat phat: '); Readln(x1); Write('Dinh ket thuc: '); Readln(x2); Write('Do dai duong di: '); Readln(l); LthuaMt(l); FindWay(x1,x2); END 4.2 Danh sách cạnh (cung) Cho đồ thị G = với số cạnh m, số đỉnh n Nếu m < 6n G thờng đợc biểu diễn dới dạng danh sách cạnh (cung) Theo cách danh sách tất cạnh (cung) đồ thị vô hớng (có hớng) Mỗi cạnh (cung) e = (x, y) đồ thị tơng ứng với hai biến Dau[e], Cuoi[e] 28 2 3 G1 G2 Hình 4.9 Ví dụ: Hình 4.9 đồ thị G1 G2 đợc biểu diễn danh sách cạnh (cung) nh sau: Dau Cuoi Dau Cuoi 2 3 3 4 4 Danh sách cạnh G1 Danh sách cung G2 Nh để lu trữ đồ thị cần sử dụng 2m đơn vị nhớ Nhợc điểm phơng pháp để xác định đỉnh đồ thị kề với đỉnh cho trớc phải làm cỡ m phép so sánh 4.3 Danh sách kề Phơng pháp biểu diễn danh sách kề đợc sử dụng phổ biến thờng hay dùng cho đồ thị có hớng Danh sách kề cho đỉnh xi danh sách gồm tất đỉnh kề x i theo thứ tự đỉnh tập đỉnh X Ta biểu diễn đồ thị nh mảng FIRST, với phần tử FIRST[i] trỏ trỏ tới danh sách kề cho đỉnh xi Ví dụ: hình 4.9 đồ thị G1 G2 đợc biểu diễn danh sách kề nh sau: FIRST 3 Nil Nil Nil Nil a) Danh sách kề đồ thị G1 FIRST Nil Nil Nil 29 Nil b) Danh sách kề đồ thị G2 Bộ nhớ sử dụng cho phơng pháp biểu diễn danh sách kề tỷ lệ thuận với tổng số đỉnh cạnh đồ thị Nhợc điểm cách biểu diễn thời gian cần thiết để xác định có cạnh từ đỉnh xi tới đỉnh xj có hay không O(n) Cách biểu diễn thích hợp cho thuật toán mà cấu trúc đồ thị hay thay đổi nh thêm bớt cạnh Ta dùng ma trận kề biểu diễn đồ thị G1 G2 hình 4.8 nh sau: Đối với đồ thị có trọng số cạnh e = (xi, xj) đợc gán trọng số l(e) (còn viết l(xi, xj) ) ma trận kề đợc thay ma trận có trọng số, M G1 = 1 0 M G2 1 = 1 phần tử ma trận trọng số cạnh tơng ứng: aij = l(xi, xj) Ưu điểm phơng pháp dễ dàng xác định đợc cặp đỉnh có kề hay không thuận tiện tìm số bậc đỉnh Việc truy cập phần tử ma trận kề qua số không phụ thuộc vào số đỉnh đồ thị Nhợc điểm lớn phơng pháp không phụ thuộc vào số cạnh đồ thị, ta phải sử dụng n2 đơn vị nhớ để lu trữ ma trận kề Định lý: Nếu G = đa đồ thị với A = (aij) ma trận kề tơng ứng, số đờng khác từ đỉnh xi đến đỉnh xj có độ dài s phần tử Pij ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong số hệ thống thông tin đợc mô hình đồ thị thực tốt số công tác kiểm kỹ thuật Ví dụ biểu diễn mạng máy tính đồ thị, giả sử có máy mà thông tin truyền chúng quan trọng, cần tiến hành kiểm tra xem có đờng truyền dự phòng chúng không Xét góc độ đồ thị cần kiểm tra xem số đờng cặp đỉnh tơng ứng với máy đó, số đờng lớn có đờng truyền dự phòng 30 * Chơng trình viết PASCAL sau tính số đờng độ dài l nhập từ bàn phím Type MaTran = Array[1 20,1 20] Of Integer; Var a, b, aa: MaTran; n,l,x1,x2: Integer; Procedure InputMt(Var Mt: Matran); Var i, j: Integer; Begin For i:=1 to n For j:=1 to n Begin Write('a',i,j,'= '); Readln(Mt[i,j]); End; End; Procedure Gan(Mt1: MaTran; Var Mt2: MaTran); {Mt2 < Mt1} Var i,j:Integer; Begin For i:=1 to n For j:=1 to n Mt2[i,j]:=Mt1[i,j]; End; Procedure TichMt(mt1,mt2: Matran; Var MtKq: MaTran); { MtKq = Mt1*Mt2 } Var i,j,k: Integer; Begin For i:=1 to n For j:=1 to n Begin MtKq[i,j]:=0; For k:=1 to n MtKq[i,j]:=MtKq[i,j]+Mt1[i,k]*Mt2[k,j]; End; End; Procedure LthuaMt(m: Integer); {aa = a ^m (m: dai duong di, m>=2) } Var i: Integer; Begin Gan(a,b); For i:=1 to m-1 Begin TichMt(b,a,aa); Gan(aa,b); End; End; Procedure FindWay(i,j: Integer); { Tim so duong di tu dinh i >j } 31 Begin If aa[i,j]0 then Writeln('So duong di dai ',l,' tu x',x1,' > ','x2 ','la: ',aa[i,j]) Else Writeln('Khong co duong di tu dinh ',i,' toi dinh ',j,' voi dai ',l); End; BEGIN Writeln('Nhap ma tran ke cho thi:'); Write('So dinh thi: '); Readln(n); InputMt(a); Write('Dinh xuat phat: '); Readln(x1); Write('Dinh ket thuc: '); Readln(x2); Write('Do dai duong di: '); Readln(l); LthuaMt(l); FindWay(x1,x2); END 4.2 Danh sách cạnh (cung) Cho đồ thị G = với số cạnh m, số đỉnh n Nếu m < 6n G thờng đợc biểu diễn dới dạng danh sách cạnh (cung) Theo cách danh sách tất cạnh (cung) đồ thị vô hớng (có hớng) Mỗi cạnh (cung) e = (x, y) đồ thị tơng ứng với hai biến Dau[e], Cuoi[e] 2 3 G1 G2 Hình 4.9 Ví dụ: Hình 4.9 đồ thị G1 G2 đợc biểu diễn danh sách cạnh (cung) nh sau: Dau Cuoi Dau Cuoi 2 3 3 4 4 Danh sách cạnh G1 Danh sách cung G2 32 Nh để lu trữ đồ thị cần sử dụng 2m đơn vị nhớ Nhợc điểm phơng pháp để xác định đỉnh đồ thị kề với đỉnh cho trớc phải làm cỡ m phép so sánh 4.3 Danh sách kề Phơng pháp biểu diễn danh sách kề đợc sử dụng phổ biến thờng hay dùng cho đồ thị có hớng Danh sách kề cho đỉnh xi danh sách gồm tất đỉnh kề x i theo thứ tự đỉnh tập đỉnh X Ta biểu diễn đồ thị nh mảng FIRST, với phần tử FIRST[i] trỏ trỏ tới danh sách kề cho đỉnh xi Ví dụ: hình 4.9 đồ thị G1 G2 đợc biểu diễn danh sách kề nh sau: FIRST 3 Nil Nil Nil Nil a) Danh sách kề đồ thị G1 FIRST Nil Nil Nil Nil b) Danh sách kề đồ thị G2 Bộ nhớ sử dụng cho phơng pháp biểu diễn danh sách kề tỷ lệ thuận với tổng số đỉnh cạnh đồ thị Nhợc điểm cách biểu diễn thời gian cần thiết để xác định có cạnh từ đỉnh xi tới đỉnh xj có hay không O(n) Cách biểu diễn thích hợp cho thuật toán mà cấu trúc đồ thị hay thay đổi nh thêm bớt cạnh Ta dùng ma trận kề biểu diễn đồ thị G1 G2 hình 4.8 nh sau: 33 Đối với đồ thị có trọng số cạnh e = (xi, xj) đợc gán trọng số l(e) (còn viết l(xi, xj) ) ma trận kề đợc thay ma trận có trọng số, M G1 = 1 0 M G2 1 = 1 phần tử ma trận trọng số cạnh tơng ứng: aij = l(xi, xj) Ưu điểm phơng pháp dễ dàng xác định đợc cặp đỉnh có kề hay không thuận tiện tìm số bậc đỉnh Việc truy cập phần tử ma trận kề qua số không phụ thuộc vào số đỉnh đồ thị Nhợc điểm lớn phơng pháp không phụ thuộc vào số cạnh đồ thị, ta phải sử dụng n2 đơn vị nhớ để lu trữ ma trận kề Định lý: Nếu G = đa đồ thị với A = (aij) ma trận kề tơng ứng, số đờng khác từ đỉnh xi đến đỉnh xj có độ dài s phần tử Pij ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong số hệ thống thông tin đợc mô hình đồ thị thực tốt số công tác kiểm kỹ thuật Ví dụ biểu diễn mạng máy tính đồ thị, giả sử có máy mà thông tin truyền chúng quan trọng, cần tiến hành kiểm tra xem có đờng truyền dự phòng chúng không Xét góc độ đồ thị cần kiểm tra xem số đờng cặp đỉnh tơng ứng với máy đó, số đờng lớn có đờng truyền dự phòng * Chơng trình viết PASCAL sau tính số đờng độ dài l nhập từ bàn phím Type MaTran = Array[1 20,1 20] Of Integer; Var a, b, aa: MaTran; n,l,x1,x2: Integer; Procedure InputMt(Var Mt: Matran); Var i, j: Integer; Begin For i:=1 to n For j:=1 to n Begin Write('a',i,j,'= '); Readln(Mt[i,j]); End; End; Procedure Gan(Mt1: MaTran; Var Mt2: MaTran); {Mt2 < Mt1} 34 Var i,j:Integer; Begin For i:=1 to n For j:=1 to n Mt2[i,j]:=Mt1[i,j]; End; Procedure TichMt(mt1,mt2: Matran; Var MtKq: MaTran); { MtKq = Mt1*Mt2 } Var i,j,k: Integer; Begin For i:=1 to n For j:=1 to n Begin MtKq[i,j]:=0; For k:=1 to n MtKq[i,j]:=MtKq[i,j]+Mt1[i,k]*Mt2[k,j]; End; End; Procedure LthuaMt(m: Integer); {aa = a ^m (m: dai duong di, m>=2) } Var i: Integer; Begin Gan(a,b); For i:=1 to m-1 Begin TichMt(b,a,aa); Gan(aa,b); End; End; Procedure FindWay(i,j: Integer); { Tim so duong di tu dinh i >j } Begin If aa[i,j]0 then Writeln('So duong di dai ',l,' tu x',x1,' > ','x2 ','la: ',aa[i,j]) Else Writeln('Khong co duong di tu dinh ',i,' toi dinh ',j,' voi dai ',l); End; BEGIN Writeln('Nhap ma tran ke cho thi:'); Write('So dinh thi: '); Readln(n); InputMt(a); Write('Dinh xuat phat: '); Readln(x1); Write('Dinh ket thuc: '); Readln(x2); Write('Do dai duong di: '); Readln(l); LthuaMt(l); 35 FindWay(x1,x2); END 4.2 Danh sách cạnh (cung) Cho đồ thị G = với số cạnh m, số đỉnh n Nếu m < 6n G thờng đợc biểu diễn dới dạng danh sách cạnh (cung) Theo cách danh sách tất cạnh (cung) đồ thị vô hớng (có hớng) Mỗi cạnh (cung) e = (x, y) đồ thị tơng ứng với hai biến Dau[e], Cuoi[e] 2 3 G1 G2 Hình 4.9 Ví dụ: Hình 4.9 đồ thị G1 G2 đợc biểu diễn danh sách cạnh (cung) nh sau: Dau Cuoi Dau Cuoi 2 3 3 4 4 Danh sách cạnh G1 Danh sách cung G2 Nh để lu trữ đồ thị cần sử dụng 2m đơn vị nhớ Nhợc điểm phơng pháp để xác định đỉnh đồ thị kề với đỉnh cho trớc phải làm cỡ m phép so sánh 4.3 Danh sách kề Phơng pháp biểu diễn danh sách kề đợc sử dụng phổ biến thờng hay dùng cho đồ thị có hớng Danh sách kề cho đỉnh xi danh sách gồm tất đỉnh kề x i theo thứ tự đỉnh tập đỉnh X Ta biểu diễn đồ thị nh mảng FIRST, với phần tử FIRST[i] trỏ trỏ tới danh sách kề cho đỉnh xi Ví dụ: hình 4.9 đồ thị G1 G2 đợc biểu diễn danh sách kề nh sau: FIRST 3 2 Nil 36 Nil Nil Nil a) Danh sách kề đồ thị G1 FIRST Nil Nil Nil Nil b) Danh sách kề đồ thị G2 Bộ nhớ sử dụng cho phơng pháp biểu diễn danh sách kề tỷ lệ thuận với tổng số đỉnh cạnh đồ thị Nhợc điểm cách biểu diễn thời gian cần thiết để xác định có cạnh từ đỉnh xi tới đỉnh xj có hay không O(n) Cách biểu diễn thích hợp cho thuật toán mà cấu trúc đồ thị hay thay đổi nh thêm bớt cạnh 37 [...]... nếu có d cung thì aij = d Chú ý aji = 0 nếu không có cung nào hớng từ xj đến xi Ma trận kề trong trờng hợp này là không đối xứng Trong 2 trờng hợp trên ta chú ý nếu đỉnh xi có một khuyên thì phần tử tơng ứng của ma trận kề là aii = 1 A B C A D B C G1 G2 Hình 4.8 Ta có thể dùng ma trận kề biểu diễn đồ thị G1 và G2 trong hình 4.8 nh sau: Đối với đồ thị có trọng số mỗi cạnh e = (xi, xj) đợc gán một trọng... đến đỉnh xj có độ dài s bằng phần tử Pij của ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong một số hệ thống thông tin khi đợc mô hình bằng đồ thị có thể thực hiện tốt một số công tác kiểm kỹ thuật Ví dụ khi biểu diễn một mạng máy tính bằng đồ thị, giả sử có 2 máy nào đó mà thông tin truyền giữa chúng là quan trọng, cần tiến hành kiểm tra xem đã có đờng truyền dự phòng giữa chúng không... đến đỉnh xj có độ dài s bằng phần tử Pij của ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong một số hệ thống thông tin khi đợc mô hình bằng đồ thị có thể thực hiện tốt một số công tác kiểm kỹ thuật Ví dụ khi biểu diễn một mạng máy tính bằng đồ thị, giả sử có 2 máy nào đó mà thông tin truyền giữa chúng là quan trọng, cần tiến hành kiểm tra xem đã có đờng truyền dự phòng giữa chúng không... đến đỉnh xj có độ dài s bằng phần tử Pij của ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong một số hệ thống thông tin khi đợc mô hình bằng đồ thị có thể thực hiện tốt một số công tác kiểm kỹ thuật Ví dụ khi biểu diễn một mạng máy tính bằng đồ thị, giả sử có 2 máy nào đó mà thông tin truyền giữa chúng là quan trọng, cần tiến hành kiểm tra xem đã có đờng truyền dự phòng giữa chúng không... đến đỉnh xj có độ dài s bằng phần tử Pij của ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong một số hệ thống thông tin khi đợc mô hình bằng đồ thị có thể thực hiện tốt một số công tác kiểm kỹ thuật Ví dụ khi biểu diễn một mạng máy tính bằng đồ thị, giả sử có 2 máy nào đó mà thông tin truyền giữa chúng là quan trọng, cần tiến hành kiểm tra xem đã có đờng truyền dự phòng giữa chúng không... đến đỉnh xj có độ dài s bằng phần tử Pij của ma trận tích AìAì ìA = As = (Pij) s lần Xét ví dụ ứng dụng: Trong một số hệ thống thông tin khi đợc mô hình bằng đồ thị có thể thực hiện tốt một số công tác kiểm kỹ thuật Ví dụ khi biểu diễn một mạng máy tính bằng đồ thị, giả sử có 2 máy nào đó mà thông tin truyền giữa chúng là quan trọng, cần tiến hành kiểm tra xem đã có đờng truyền dự phòng giữa chúng không... đỉnh xi tới đỉnh xj có hay không mất O(n) Cách biểu diễn này thích hợp cho các thuật toán mà cấu trúc đồ thị hay thay đổi nh thêm hoặc bớt các cạnh Ta có thể dùng ma trận kề biểu diễn đồ thị G1 và G2 trong hình 4.8 nh sau: Đối với đồ thị có trọng số mỗi cạnh e = (xi, xj) đợc gán một trọng số l(e) (còn viết là l(xi, xj) ) thì ma trận kề của nó đợc thay bằng ma trận có trọng số, khi đó M G1 1 1 = 1... đỉnh xi tới đỉnh xj có hay không mất O(n) Cách biểu diễn này thích hợp cho các thuật toán mà cấu trúc đồ thị hay thay đổi nh thêm hoặc bớt các cạnh Ta có thể dùng ma trận kề biểu diễn đồ thị G1 và G2 trong hình 4.8 nh sau: Đối với đồ thị có trọng số mỗi cạnh e = (xi, xj) đợc gán một trọng số l(e) (còn viết là l(xi, xj) ) thì ma trận kề của nó đợc thay bằng ma trận có trọng số, khi đó M G1 1 1 = 1... sách kề Phơng pháp biểu diễn bằng danh sách kề cũng đợc sử dụng khá phổ biến và thờng hay dùng cho đồ thị có hớng Danh sách kề cho đỉnh xi là danh sách gồm tất cả các đỉnh kề của x i theo thứ tự các đỉnh trong tập đỉnh X Ta có thể biểu diễn đồ thị nh một mảng FIRST, với phần tử FIRST[i] là con trỏ trỏ tới danh sách kề cho đỉnh xi Ví dụ: ở hình 4.9 đồ thị G1 và G2 đợc biểu diễn bằng danh sách kề nh sau:... đỉnh xi tới đỉnh xj có hay không mất O(n) Cách biểu diễn này thích hợp cho các thuật toán mà cấu trúc đồ thị hay thay đổi nh thêm hoặc bớt các cạnh Ta có thể dùng ma trận kề biểu diễn đồ thị G1 và G2 trong hình 4.8 nh sau: Đối với đồ thị có trọng số mỗi cạnh e = (xi, xj) đợc gán một trọng số l(e) (còn viết là l(xi, xj) ) thì ma trận kề của nó đợc thay bằng ma trận có trọng số, khi đó M G1 1 1 = 1 ... lần Xét ví dụ ứng dụng: Trong số hệ thống thông tin đợc mô hình đồ thị thực tốt số công tác kiểm kỹ thuật Ví dụ biểu diễn mạng máy tính đồ thị, giả sử có máy mà thông tin truyền chúng quan trọng,... lần Xét ví dụ ứng dụng: Trong số hệ thống thông tin đợc mô hình đồ thị thực tốt số công tác kiểm kỹ thuật Ví dụ biểu diễn mạng máy tính đồ thị, giả sử có máy mà thông tin truyền chúng quan trọng,... lần Xét ví dụ ứng dụng: Trong số hệ thống thông tin đợc mô hình đồ thị thực tốt số công tác kiểm kỹ thuật Ví dụ biểu diễn mạng máy tính đồ thị, giả sử có máy mà thông tin truyền chúng quan trọng,