Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
470 KB
Nội dung
Đường đi Euler Hỏi: Các hình này có vẽ được một nét không? Trả lời: Được! Nhưng điểm cuối không trùng điểm xuất phát Trong lý thuyết đồ thị, một đường đi trong đồ thị G=(X,E) được gọi là đường đi Euler nếu nó đi qua tất cả các cạnh của đồ thị, mỗi cạnh đúng một lần. Đường đi Euler có đỉnh cuối cùng trùng với đỉnh xuất phát gọi là chu trình Euler. Khái niệm chu trình Euler xuất phát từ bài toán bảy cây cầu do Euler giải quyết vào khoảng năm 1737. Đường đi Euler có thể tìm thấy trong các bài toán vui vẽ một nét (vẽ một hình nào đó mà không nhấc bút khỏi mặt giấy, không tô lại cạnh nào hai lần). Carl Hierholzer là người đầu tiên mô tả hoàn chỉnh đồ thị Euler vào năm 1873, bằng cách chứng minh rằng đồ thi Euler là đồ thị liên thông không có đỉnh bậc lẻ. Định nghĩa về chu trình và đường đi Euler 1. Đường đi Euler (tiếng Anh: Eulerian path, Eulerian trail hoặc Euler walk) trong đồ thị vô hướng là đường đi của đồ thị đi qua mỗi cạnh của đồ thị đúng một lần. 2. Chu trình Euler (tiếng Anh: Eulerian cycle, Eulerian circuit hoặc Euler tour) trong đồ thị vô hướng) là một chu trình đi qua mỗi cạnh của đồ thị đúng một lần. 3. Đồ thị gọi là đồ thị Euler khi nó chứa chu trình Euler, và được gọi là nửa Euler khi nó chứa đường đi Euler. 4. Đối với các đồ thị có hướng, các thuật ngữ đường đi và chu trình được thay bằng đường đi có hướng và chu trình có hướng. • Ghi chú: Một đồ thị là Euler thì sẽ là nửa Euler; điều ngược lại không đúng. Định lý Euler về chu trình và đường đi Euler Đồ thị Bảy cây cầu Königsberg có 4 đỉnh bậc lẻ nên không là đồ thị Euler 1. Đồ thị vô hướng liên thông G=(X, E) có chu trình Euler khi và chỉ khi G không có đỉnh bậc lẻ. 1 2. Đồ thị vô hướng liên thông G=(X, E) có đường đi Euler khi và chỉ khi G có không quá hai đỉnh bậc lẻ. Nếu G có hai đỉnh bậc lẻ thì đường đi Euler có hai đầu đường đi nằm ở hai đỉnh bậc lẻ. Các tính chất khác 1. Một đồ thị vô hướng là đồ thị Euler nếu nó liên thông và có thể phân tích thành các chu trình có các cạnh rời nhau. 2. Nếu đồ thị vô hướng G là Euler thì đồ thị đường L(G) cũng là Euler. 3. Đồ thị có hướng là Euler nếu nó liên thông và mọi đỉnh của nó có bậc vào bằng bậc ra. 4. Đồ thị có hướng là Euler nếu nó liên thông và có thể phân tích thành các chu trình có hướng với các cung rời nhau. Giải thuật Bỏ cây cầu nối B với D, xây cây cầu nối A với C, đồ thị không có đỉnh bậc lẻ nên là đồ thị Euler Giả sử G=(V,E) là đồ thị vô hướng, liên thông, tất cả các đỉnh đều có bâc chẵn hơn nữa G là hữu hạn. Khi đó, tất cả các đỉnh đều có bậc lớn hơn 1. Giải thuật 2: Không đi qua cầu • Một cạnh của đồ thị G được gọi là cầu, nếu khi xóa cạnh đó khỏi đồ thị thì làm tăng số thành phần liên thông của G. Giải thuật Gọi chu trình cần tìm là C 1. Khởi tạo: Chọn một đỉnh bất kỳ cho vào C. 2. Nếu G không còn cạnh nào thì dừng. 3. Bổ sung: Chọn một cạnh nối đỉnh vừa chọn với một đỉnh kề với nó theo nguyên tắc: chỉ chọn cạnh cầu nếu không còn cạnh nào khác để chọn. Bổ sung cạnh vừa chọn và đỉnh cuối của nó vào C, xóa cạnh ấy khỏi G. Quay về bước 2. Xem thêm Bài toán bảy cây cầu Euler 2 Bản đồ Königsberg thời Euler, mô tả vị trí thực của bay cây cầu và sông Pregel. Bài toán bảy cây cầu Euler, còn gọi là Bảy cầu ở Königsberg nảy sinh từ nơi chốn cụ thể. Thành phố Königsberg, Đức (nay là Kaliningrad, Nga) nằm trên sông Pregel, bao gồm hai hòn đảo lớn nối với nhau và với đất liền bởi bảy cây cầu. Câu hỏi đặt ra là có thể đi theo một tuyến đường mà đi qua mỗi cây cầu đúng một lần rồi quay lại điểm xuất phát hay không. Năm 1736, Leonhard Euler đã chứng minh rằng điều đó là không thể được. Người ta kể rằng, khoảng năm 1750, vào các ngày Chủ nhật, những người dân giàu có và học thức của thành phố đã đi dạo quanh để tìm cách giải bài này, nhưng đây có lẽ chỉ là một truyền thuyết. Lời giải của Euler Để chứng minh kết quả, Euler đã phát biểu bài toán bằng các thuật ngữ của lý thuyết đồ thị. Ông loại bỏ tất cả các chi tiết ngoại trừ các vùng đất và các cây cầu, sau đó thay thế mỗi vùng đất bằng một điểm, gọi là đỉnh hoặc nút, và thay mỗi cây cầu bằng một đoạn nối, gọi là cạnh hoặc liên kết. Cấu trúc toán học thu được được gọi là một đồ thị. → → Hình thù của đồ thị có thể bị bóp méo theo đủ kiểu nhưng không làm đồ thị bị thay đổi, miễn là các liên kết giữa các nút giữ nguyên. Việc một liên kết thẳng hay cong, một nút ở bên phải hay bên trái một nút khác là không quan trọng. Euler nhận ra rằng bài toán có thể được giải bằng cách sử dụng bậc của các nút. Bậc của một nút là số cạnh nối với nó; trong đồ thị các cây cầu Königsberg, ba nút có bậc bằng 3 và một nút có bậc 5. Euler đã chứng minh rằng một chu trình có dạng như mong muốn chỉ tồn tại khi và chỉ khi không có nút bậc lẻ. Một đường đi như vậy được gọi là một chu trình Eul er . Do đồ thị các cây cầu Königsberg có bốn nút bậc lẻ, nên nó không thể có chu trình Euler. 3 Có thể sửa đổi bài toán để yêu cầu một đường đi qua tất cả các cây cầu nhưng không cần có điểm đầu và điểm cuối trùng nhau. Đường đi như vậy được gọi là một đường đi Euler. Một đường đi như vậy tồn tại khi và chỉ khi đồ thị có đúng hai đỉnh bậc lẻ. (Như vậy điều này cũng không thể đối với bảy cây cầu ở Königsberg.) Ý nghĩa của bài toán đối với lịch sử toán học Trong lịch sử toán học, lời giải của Euler cho bài toán bảy cây cầu ở Königsberg được coi là định lý đầu tiên của lý thuyết đồ thị, ngành nghiên cứu mà nay được coi là một nhánh của toán học tổ hợp (combinatorics), tuy các bài toán tổ hợp đã được quan tâm đến từ sớm hơn rất nhiều. Ngoài ra, nhận xét của Euler rằng thông tin quan trọng là số cây cầu và danh sách các vùng đất ở đầu cầu (chứ không phải vị trí chính xác của chúng) đã là dấu hiệu cho sự phát triển của ngành tôpô học. Sự khác biệt giữa sơ đồ thực và sơ đồ đồ thị là một ví dụ tốt rằng tôpô học không quan tâm đến hình thù cứng nhắc của các đối tượng. 4 Đường đi Hamilton Trong toán học, ngành lý thuyết đồ thị, một đường đi Hamilton là một đường đi trong đồ thị vô hướng đi qua tất cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần. Một Chu trình Hamilton là một đường đi Hamilton sau đi qua tất cả các đỉnh của đồ thị thì trở về đỉnh xuất phát. Một đồ thị có chu trình Hamilton được gọi là đồ thị Hamilton, đồ thị có đường đi Hamilton được gọi là đồ thị nửa Hamilton. Bài toán tìm đường đi và chu trình như vậy được gọi là bài toán Hamilton. Bài toán Hamilton là NP đầy đủ. Tên gọi đường đi và chu trình Hamilton là gọi theo tên của William Rowan Hamilton . Các ví dụ Đường đi của quân mã trên bàn cờ 3×4 là đường Hamilton. Các đồ thị Hamilton • Một đồ thị đầy đủ có nhiều hơn hai đỉnh là đồ thị Hamilton. • Mọi đồ thị vòng là Hamilton. • Đồ thị khối ba chiều là đồ thị Hamilton Định lý Bondy-Chvátal 5 Cho đồ thị G có n đỉnh, bao đóng cl(G) được tạo ra từ G bằng cách bổ sung cho mỗi cặp đỉnh không kề nhau u và v với degree(v) + degree(u) ≥ n một cạnh mới uv. Định lý Bondy-Chvátal (1972) Một đồ thị là Hamilton nếu và chỉ nếu bao đóng của nó là Hamilton. Vì đồ thi đầy đủ là Hamilton, nên tất cả các đồ thị mà bao đóng là đầy đủ là Hamilton. Dirac (1952) Một đơn đò thị n đỉnh (n > 2) là Hamilton nếu mọi đỉnh của nó có bậc không nhỏ hơn n/2. Ore (1960) Một đồ thị có n đỉnh (n > 2) là Hamilton nếu tổng các bậc của hai đỉnh không kề nhau đều bằng n hoặc lớn hơn. 6 Cây bao trùm nhỏ nhất Cây bao trùm nhỏ nhất của đồ thị mặt phẳng. Tìm cây bao trùm nhỏ nhất (tiếng Anh: minimum spanning tree) là bài toán tối ưu có nhiều ứng dụng trong thực tế. Nó có thể là bài toán tìm hệ thống liên thông với chi phí nhỏ nhất, hoặc ngược lại, vói lợi nhuân lớn nhất. Hai thuật toán tìm cây bao trùm nhỏ nhất và lớn nhất thường được nhắc đến là thuật toán Prim và thuật toán Krusskal. • Xem thêm Thuật toán tìm cây bao trùm Bài toán Cho G=(X,E) là một đồ thị liên thông. Ngoài ra, một hàm trọng số W(e) nhận các giá trị thực, xác định trên tập các cạnh E của G. Cả hai thuật toán Prim và Kruskal đều dựa trên tư tưởng của các giải thuật tham lam: Ở mỗi bước của thuật toán ta chọn và bổ sung vào cây cạnh có trọng số nhỏ nhất có thể. Giải thuật Prim Giải thuật Prim dựa trên cấu trúc của giải thuật tìm cây bao trùm theo chiều rộng hoặc chiều sâu, chỉ thay đổi về tiêu chuẩn chọn đỉnh sẽ bổ sung vào cây ở từng bước. // Vài nét R. C. Prim Robert Clay Prim (sinh 1921 tại Sweetwater, Texas) là một nhà toán học và khoa học máy tính Mỹ. Năm 1941 ông đã lấy bằng cử nhân ở khoa kỹ thuật điện đại học Princeton. Sau này năm 1949, ông nhận bằng Ph.D. về toán học cũng tại đây. Giải thuật mang tên Prim được tìm ra từ năm 1930 bởi nhà toán học Vojtěch Jarník và do Prim hoàn thiện vào năm 1957. Mô tả 7 Gọi T là cây bao trùm sẽ xây dựng 1. Chọn một đỉnh s bất kỳ của G cho vào cây T. Khi đó T là một cây chỉ có một đỉnh và chưa có cạnh nào. 2. Nếu T đã gồm tất cả các đỉnh của G thì T là cây bao trùm cần tìm. Kết thúc. 3. Nếu G còn có các đỉnh không thuộc T, vì G liên thông nên có các cạnh nối một đỉnh trong T với một đỉnh ngoài T, chọn một cạnh có trọng số nhỏ nhất trong số đó cho vào T. 4. Quay lại 2. Giả mã Giải thuật trình bày Prim ở trên dễ dàng thực hiện khi ta quan sát một đồ thị được biểu diễn trên mặt phẳng với một số ít đỉnh. Tuy nhiên để cài đặt thành một chương trình chạy trên máy tính cũng cần phân tích thêm một số điểm. Liệu có thể sử dụng một hàng đợi (queue) giống như trong giải thuật tìm cây bao trùm theo chiều sâu không? Có. Nhưng điều khác biệt là ta sẽ sử dụng một hàng đợi có ưu tiên, tiêu chuẩn ưu tiên ở đây là cạnh nối đỉnh sẽ được bổ sung vào T là nhỏ nhất. Một cấu trúc thuận lợi cho hàng đợi có ưu tiên là cấu trúc đống (heap) như đã sử dụng trong giải thuật sắp xếp vun đống hoặc giải thuật xây dựng mã Huffman. Giả sử G=(X,E) là đồ thị liên thông, Ajd(u), là danh sách đỉnh kề của đỉnh u. L(e) là hàm trọng số xác đinh với moi cạnh . Trong đoạn mã sau ta dùng hàm COLOR(u) để tô màu các đỉnh của G bằng các màu WHITE, GRAY, BLACK để chỉ các trạng thái chưa xét, đang xét và đã xét xong của mỗi đỉnh, hàm PARENTS(u) chỉ đỉnh cha của đỉnh u trong cây, hàm DISTAN(u,T) chỉ trọng số nhỏ nhất của các cạnh nối từ đỉnh u ngoài T đến các đỉnh trong T. Ta cũng sử dụng một cấu trúc HEAP làm hàng đợi ưu tiên chứa các đỉnh đang chờ xét. Ở bước khởi tạo, một đỉnh r bất kỳ được đưa vao Heap. Số các phần tử của đống là n=1. Cho đến khi hàng đợi Heap còn khác rỗng ta thực hiện các bước sau: lấy đỉnh u nằm ở gốc Heap ra để đưa vào cây. Đối với đỉnh u mới được bổ sung vào cây ta duyệt qua tất cả các đỉnh v thuộc danh sách kề với nó. Nếu đỉnh v chưa thuôch T và không nằm trong đống ta chèn v vào đống, nếu đỉnh v đã nằm trong đống đợi ta tính lại khoảng cách từ v của nó với tập các đỉnh đã nằm trong T, và vun lại đống. Sau khi tất cả các đỉnh ) đã duyệt qua bằng cách ấy thì thì đỉnh u đã được duyệt xong và được đưa vào cây. Procedure Prim (G, r, W(e)) { Var list COLOR(u), PARENTS(u), DISTAN(u),Heap H For each u of E { COLOR(u)= WHITE PARENTS(u)=Null DISTAN(u)= M } H(1)=r n=1 DISTAN(r)=0 While n> 0 do u=H(1) n=n-1 Color(u)=BLACK For each v of Ajd(u) { if (Color(v)=WHITE) or ((Color(v)=GRAY) and (DISTAN(v)<W(u,v) 8 then { COLOR(v)=GRAY PARENTS(v)=u DISTAN(v)=W(u,v) if Color(v)=WHITE then InsertHeap(H,v) else UpHeap(H,HeapIndex(v)) } } } Một chương trình đầy đủ bằng ngôn ngữ Pascal program Prim_Algorithm; uses dos,crt; const max=150; type filename=string[12]; var TrongSo: array[1 max,1 max] of integer; DinhKe: array[1 max] of integer; CanhKe: array[1 max] of integer;{} n, DodaiCayKhung: integer; i,j: integer; fname: filename; ch: char; h,m,s, hund:word; procedure PrintMatrix; Begin (*In ma tran ra *) Writeln(' '); Writeln('Ma tran trong so, Khong co canh noi thi trong so = MaxInt'); for i:=1 to n do Begin For j:=1 to n do if TrongSo[i,j]=Maxint then write(' 0',' ') else write(TrongSo[i,j]:5,' '); Writeln; End; Writeln(' '); End; procedure ReadInputFile(fname: filename); var i,j: integer; f: text; begin assign(f,fname); reset(f); readln(f,n); for i:=1 to n do begin for j:=1 to n do begin read(f,TrongSo[i,j]); if TrongSo[i,j]=0 then TrongSo[i,j]:=MaxInt; end; readln(f); 9 end; close(f); PrintMatrix; end; procedure Prim; var v,i,k: integer; min: integer; begin for v:=2 to n do begin DinhKe[v]:=1; CanhKe[v]:=TrongSo[1,v]; end; for i:=2 to n do begin min:=MaxInt; for k:=2 to n do if (CanhKe[k]>=0) and (CanhKe[k]<min) then begin min:=CanhKe[k]; ( v:=k; end; CanhKe[v]:=-1; for k:=2 to n do if (TrongSo[v,k]<CanhKe[k]) and (TrongSo[v,k]>0) then begin CanhKe[k]:=TrongSo[v,k]; DinhKe[k]:=v; end; end; end; procedure WriteOutputFile; var i: integer; f: text; begin assign(f,'prim.out'); rewrite(f); Writeln(f,' '); Writeln(f,'Ma tran trong so, Khong co canh noi thi trong so = MaxInt'); for i:=1 to n do Begin For j:=1 to n do if TrongSo[i,j]=Maxint then write(f,' 0',' ') else write(f,TrongSo[i,j]:5,' '); Writeln(f,); End; Writeln(f,' '); DodaiCayKhung:=0; writeln(f,'Cay khung nho nhat gom cac canh:'); for i:=2 to n do begin write(f,'(',i,',',DinhKe[i],') '); DodaiCayKhung:=DodaiCayKhung+TrongSo[i,DinhKe[i]]; end; writeln(f); writeln(f,'Length: ',DodaiCayKhung); close(f); 10 [...]... dễ dàng trên các đồ thị có số các đỉnh và cạnh tương đối nhỏ Mã giả Để xây dựng giải thuật trên máy tính cần làm rõ các cấu trúc dữ liệu biểu diễn đồ thị cũng như quá trình xét các đỉnh và các cạnh Giả sử đồ thị G cho bởi các danh sách các cạnh kề với từng đỉnh Danh sách này thường được ký hiệu là Adj[u] đối với danh scáh các cạnh kề đỉnh u Để phân biệt các đỉnh chưa nằm trong T, các đỉnh trong T đã... Return PARENTS Thuật toán tìm cây bao trùm theo chiều sâu Miêu tả thuật toán Tìm kiếm ưu tiên chiều chiều sâu (tiếng Anh :Depth-first search, viết tắt là DFS) là một thuật toán tìm kiếm trên đồ thị Thứ tự viếng thăm các đỉnh trong DFS,đi càng xa càng tốt, nếu không đi được nữa thì quay lại Tư tưởng của thuật toán này là trong quá trình tìm các đỉnh của đồ thị để ghép vào cây ta luôn tìm các tìm các đỉnh... 15 Thuật toán Dijkstra 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 đến mỗi đỉnh của đồ thị. .. của đồ thị liên thông G cũng có thể định nghĩa như một đồ thị con không chu trình lớn nhất, hay một đồ thị con liên thông nhỏ nhất của G Mọi đồ thị liên thông đều có cây bao trùm Số các cây bao trùm của một đồ thị liên thông Gọi t(G) là số các cây bao trùm của đồ thị liên thông G Trong một số trường hợp, số t(G) có thể tính trực tiếp Chảng hạn nếu G là một cây, khi đó t(G)=1, còn khi G là một đồ thị. .. recurrence), trong đó G-e là đa đò thị suy ra từ G bằng cách xóa đi cạnh e và G/e là đồ thị rút gọn cạnhe của G, trong đó các cạnh bội xuất hiện từ phpé rút gọn mày không bị xóa Để tìm cây bao trùm, ta có thể áp dụng các thuật toán tìm kiếm theo chiều rộng hoặc tìm kiêm theo chiều sâu Giả sử G=(X,E) là đồ thị liên thông Vì cây bao trùm phải chứa tất cả các đỉnh của đồ thị nên bất kỳ đỉnh nào cũng phải có mặt trong. .. hai thuật toán sau đều lấy điểm xuất phát từ một đỉnh bất kỳ • Xem thêm Tìm cây bao trùm nhỏ nhất Thuật toán tìm cây bao trùm theo chiều rộng Tìm kiếm ưu tiên chiều rộng (tiếng Anh: Breadth first search, viết tắt BFS) là thuật toán tìm đồ thị bắt đầu ở đỉnh gốc và trước tiên tìm kiếm trong các đỉnh kề Miêu tả thuật toán 19 Thứ tự viếng thăm các đỉnh trong BFS, gần trước, xa sau Tư tưởng của thuật toán. .. cạnh, do đó còn các cạnh của G chưa thuộc T Trong các cạnh của G chưa thuộc T có các cạnh không tạo ra chu trình với các cạnh đã có trong T, Chọn cạnh v có trọng số nhỏ nhất trong các cạnh ấy bổ sung (cùng với các đỉnh chưa thuộc T của nó) vào T 4 Quay lại 2 Một vài tác giả có cách trình bày khác của giải thuật Kruskal, tuy bản chất quá trình là giống nhau 1 Khởi tạo: T lúc đầu gồm tất cả các đỉnh của... thì t(G)=n Với đồ thị G bất kỳ, số t(G) có tính nhờ Định lý Kirchhoff Công thức Cayley là công thức cho số các cây bao trùm của đồ thị đầy đủ Kn với n đỉnh: t(Kn) = nn − 2 Nếu G là đồ thị hai phía đầy đủ Kp,q, thì t(G) = pq − 1qp − 1, còn nếuG là [ [đồ thị khối n-chiều]] Qn, thì Các công thức này rút ra từ lý thuyết các ma trận Nếu G là một đa đồ thị và e là một cạnh của G, thí số t(G) các cây bao trùm... 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ần vậ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ơn khoảng cách hình... chạy Thuật toán Dijkstra bình thường sẽ có độ phức tạp là O( n^2+m ) Tuy nhiên ta có thể sử dụng kết hợp với cấu trúc heap, khi đó độ phức tạp sẽ là O( (n+m)*log2(n) ) 18 Cây bao trùm Cây bao trùm (tiếng Anh: spanning tree), còn được gọi là cây khung, của đồ thị G là cây con của đồ thị G, chứa tất cả các đỉnh của G Nói cách khác, cây bao trùm của một đồ thị G là một đồ thị con của G, chứa tất cả các . Hamilton. Các đồ thị Hamilton • Một đồ thị đầy đủ có nhiều hơn hai đỉnh là đồ thị Hamilton. • Mọi đồ thị vòng là Hamilton. • Đồ thị khối ba chiều là đồ thị Hamilton Định lý Bondy-Chvátal 5 Cho đồ thị. đồ thị vô hướng là đồ thị Euler nếu nó liên thông và có thể phân tích thành các chu trình có các cạnh rời nhau. 2. Nếu đồ thị vô hướng G là Euler thì đồ thị đường L(G) cũng là Euler. 3. Đồ thị. qua tất cả các đỉnh của đồ thị thì trở về đỉnh xuất phát. Một đồ thị có chu trình Hamilton được gọi là đồ thị Hamilton, đồ thị có đường đi Hamilton được gọi là đồ thị nửa Hamilton. Bài toán tìm