1. Trang chủ
  2. » Công Nghệ Thông Tin

giới thiệu các giải thuật đồ thị cơ bản trong toán rời rạc

24 971 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 24
Dung lượng 470 KB

Nội dung

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

Trang 1

Đườ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ẻ

Trang 2

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ọncạ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

Trang 3

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 Euler 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.

Trang 4

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 ở đầucầ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

Trang 5

Đườ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

Trang 6

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

Trang 7

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ả

Trang 8

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âukhô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 khihà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

Trang 9

TrongSo: array[1 max,1 max] of integer;

DinhKe: array[1 max] of integer;

CanhKe: array[1 max] of integer;{}

Trang 10

writeln(f,'Cay khung nho nhat gom cac canh:');

Trang 11

end;

begin

repeat

clrscr;

writeln('THUAT TOAN PRIM TIM CAY KHUNG NHO NHAT');

writeln(' DUNG MA TRAN KE');

write('Cac canh cua cay khung be nhat:');

for i:=2 to n do write('(',i,',',DinhKe[i],')');

write('Hay nhap so dinh cua do thi:'); readln(n);

for i:=1 to n do TrongSo[i,i]:=0;

Writeln('Ket thuc chay: ',h,':',m,':',s,':',hund);

write('Cac canh cua cay khung be nhat:');

for i:=2 to n do write('(',i,',',DinhKe[i],')');

WriteOutputFile;

Writeln;

writeln('Gia cua cay khung : ',DodaiCayKhung);

writeln;

Trang 12

write('Hay nhap so dinh cua do thi:'); readln(n);

for i:=1 to n do TrongSo[i,i]:=0;

Writeln('Ket thuc chay: ',h,':',m,':',s,':',hund);

write('Cac canh cua cay khung be nhat:');

for i:=2 to n do write('(',i,',',DinhKe[i],')');

Các thao tác trên Heap

Trong đoạn mã trên có sử dụng hàm InsertHeap(H,v) để chèn đỉnh v vào đống H, hàm

UpHeap(H,v) để sắp xếp lại đống H (vun lại đống) khi thay giá trị DISTAN(v) bằng giá trị

nhỏ hơn

 Trong các thủ tục về Heap, ta tổ chức Heap như một mảng H(1 n) trong đó mỗi phần tử

trong nó là các đỉnh của G được sắp xếp sao cho DISTAN(H(i)) ≤ DISTAN(H(2*i)) (nếu 2*i

≤n) và DISTAN(H(i)) ≤ DISTAN(H(2*i+1)) (nếu 2*i+1 ≤ n).

Vì Heap chứa các đỉnh nên ta thêm một mảng HeapIndex(v) để xác định vị trí của đỉnh v

trong Heap

Thao tác InsertHeap thêm một phần tử vào cuối Heap và điều chỉnh lại vị trí các phần tử sao

cho nó vẫn là Heap nhờ thao tác UpHeap(H,n)

 Thao tác UpHeap(k) điều chỉnh lại vị trí của phần tử v nằm tại vị trí thứ k của Heap khi giá

trị DISTAN(v) thay bằng giá trị nhỏ hơn Rõ ràng khi đó chỉ cần so sánh DISTAN của v với

DISTAN của đỉnh cha của trong Heap.

Procedure InsertHeap(H,v){

Trang 13

i:= Lshift(k,1) /*Chia đôi lấy phần nguyên*/

While (k>0) and DISTAN(H(k))<DISTAN(H(i)) {

Swap(H(k),H(i)) /*Đổi chỗ H(k) H(i)*/

k:=i

i:=LShift(k,1) /*Chia đôi lấy phần nguyên*/

}

}

Trang 14

Giải thuật Kruskal

Giải thuật Kruskal không dựa trên tư tưởng của các thuật toán tìm kiếm theo chiều rộng hoặc chiều sâu Trong các thuật toán này, tại từng bước của quá trình xây dựng T luôn là một cây, chỉ có điều kiện về số đỉnh của T phải đến bước cuối cùng mới thỏa mãn Còn trong thuật toán Kruskal, trong quá trình xây dựng T có thể chưa là cây, nó chỉ thỏa mãn điều kiện không có chu trình

Mô tả

Giả sử G liên thông có n đỉnh Gọi T là cây bao trùm sẽ xây dựng

1 Khởi tạo: T lúc đầu là một đồ thị rỗng

2 Nếu T đã gồm đúng n-1 cạnh của G thì T là cây bao trùm cần tìm Kết thúc

3 Nếu T còn chưa đủ n-1 cạnh, thì vì G liên thông, nên G có không ít hơn n-1 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 G và chưa có cạnh nào,như vây T lúc đầu là một rừng n cây,mỗi cây gồm đúng một đỉnh

 Khi lập trình cài đặt giải thuật Kruskal có hai điểm mấu chốt cần chú ý:

1 Trong mỗi lần lặp ta chọn cạnh có trọng số nhỏ nhất đưa vào T

2 Cạnh được chọn đưa vào T phải không tạo thành chu trình với các cạnh đã có trong T

 Vấn đề thứ nhất được giải quyết gần giống như trong giải thuật Prim là tạo một hàng đợi có

ưu tiên trên danh sách các cạnh Tuy nhiên có thể ngay từ đầu sắp xếp các cạnh theo thứ tự tăng dần của trọng số

Để giải quyết vần đề thứ hai, ta quay lại chú ý rằng, khác với giải thuật Prim, tại mỗi bước của giải thuật Kruskal, tập các đỉnh và các cạnh đã được đưa vào T chưa là cây mà chỉ thỏa mã tính không chu trình Như vậy tại mỗi bước T là một rừng, T =

Bây giờ xét một cạnh e = (u,v) của G chưa nằm trong T có 3 khả năng xảy ra:

Trang 15

1 Cả u,v chưa thuộc T Khi đó nếu bổ sung e vào T thì không có chu trình, nhưng chính cạnh e

tạo thành một cây con mới

2 Một đỉnh chẳng hạn u thuộc T, còn đỉnh kia v không thuộc T Việc bổ sung cạnh e và đỉnh v vào T (vào cây con chứa đỉnh u) không tạo ra chu trình.

3 Cả u,v đều nằm trong T Khi đó

1 Nếu u,v nằm trong cùng một cây con T k ta không thể bổ sung canh e vào T.

2 Nếu u,v nằm trong hai cây con khác nhau thì có thể bổ sung cạnh e vào T (hai đỉnh u,

v đã nằm trong T không cần bổ sung, sau khi bổ sung hai cây con sẽ hợp lại thành một cây

Tổ chức dữ liệu

 Giả sử G=(V,E)là đồ thị vô hướng n đỉnh, cho bằng danh sách kề Ajd(u), Các đỉnh của G được đánh số từ 1 đến n, nghiã là V=V[1 n];Ta cũng kí hiệu Index(u) là chỉ số của đỉnh u trong mảng V

Hàm trọng số W(u,v) xác định trên các cạnh Với mỗi cạnh e=(u,v) ký hiệu e.x u, e.y=v là hai đỉnh liên thuộc với cạnh e

 Các biến sau được đưa vào

o Hàng đợi Q của các cạnh xếp theo thứ tự trọng số từ nhỏ đến lớn

o Với mỗi cây con, hàm PARENTS(u) xác định trên V, biểu diễn chỉ số của đỉnh cha của đỉnh u trong một cây Riêng đỉnh gốc u của mỗi cây hàm PARENTS(u)lưu trữ số đỉnh trong cây với dấu âm

Procedure Kruskal (G)

T = V;

Q =Sort(E)

/* Tạo n cây, mỗi cây gồm một đỉnh*/

For each u of X do Parent(u):=-1;

Ngày đăng: 17/10/2014, 07:30

HÌNH ẢNH LIÊN QUAN

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. - giới thiệu các giải thuật đồ thị cơ bản trong toán rời rạc
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 (Trang 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ẻ - giới thiệu các giải thuật đồ thị cơ bản trong toán rời rạc
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ẻ (Trang 2)
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 - giới thiệu các giải thuật đồ thị cơ bản trong toán rời rạc
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 (Trang 3)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w