Chu trình Euler vμ đ−ờng đi Euler.

Một phần của tài liệu Bài giảng toán rời rạc pptx (Trang 70 - 76)

A B∩ C Tổng quát: Giả sử

3.3.3. Chu trình Euler vμ đ−ờng đi Euler.

Một trong các trò chơi đ−ợc yêu thích của học sinh lμ vẽ một hình nμo đó bởi một nét bút, có nghĩa lμ hoμn thμnh một hình vẽ từ khi đặt ngòi bút lên mảnh giấy cho đến khi nhấc ngòi bút lên khỏi mặt giấỵ Theo một khía cạnh nμo đó ta có thể coi các hình vẽ nh− vậy lμ các đồ thị Euler hoặc nửa Euler.

Lý thuyết về đồ thị Euler có nguồn gốc từ bμi toán nổi tiêng ”Bảy cây cầu ở thμnh phố Konigsberg” còn gọi lμ ”Bμi toán bảy cây cầu Euler”.

Thμnh phố Konigsberg, Đông Phổ (nay lμ Kaliningrad, Nga) nằm trên sông Pregel, bao gồm hai cù lao lớn nối với nhau vμ với hai bờ sông bởi bảy cây cầụ 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. Trong một thời gian dμi các c− dân của thμnh phố nμy tìm cách dạo chơi qua bảy cây cầu để cố gắng tìm cho đ−ợc câu trả lời, nh−ng vẫn không tìm đ−ợc lời giải đáp. Bμi toμn nμy đã đ−ợc nhμ toán học Thụy sỹ Leonad Euler (1707-1783) giải đ−ợc năm 1736 bằng việc chứng minh rằng bμi toán không có ph−ơng án vμ đó lμ một trong những ứng dụng sớm nhất của lý thuyết đồ thị hay tôpô học.

Định nghĩạ Trong một đồ thị G, một đ−ờng đi đơn chứa tất cả các cạnh của đồ thị đ−ợc gọi lμ đ−ờng đi Euler, một chu chu trình đơn chứa tất cả các cạnh

của đồ thị đ−ợc gọi lμ chu trình Euler.

Một đồ thị có thể có hoặc không có đ−ờng đi hoặc chu trình Euler. Đồ thị có đ−ờng đi Euler đ−ợc gọi lμ đồ thị nửa Euler, đồ thị có chu trình Euler

đ−ợc gọi lμ đồ thị Euler. Hiển nhiên đồ thị Euler lμ nửa Euler.

Ví dụ: Trong ba đồ thị d−ới đây, đồ thị bên trái lμ đồ thị Euler, đồ thị ở giữa lμ đồ thị nửa Euler, còn đồ thị bên phải không lμ đồ thị nửa Euler.

Định lý 3. (về điều kiện cần vμ đủ để có chu trình Euler).

ạ Cần vμ đủ để đồ thị vô h−ớng liên thông G có chu trình Euler lμ mọi đỉnh của đồ thị đều có bậc chẵn.

b. Cần vμ đủ để một đồ thị có h−ớng liên thông mạnh có chu trình Euler tại mỗi đỉnh v đều có deg+(v) = deg−(v).

Chứng minh. ạ Cần: Khi đồ thị có chu trình Euler, mỗi lần chu trình đi qua một đỉnh nμo đó thì bậc của đỉnh đó đ−ợc tính thêm 2 đơn vị do góp 1

đơn vị khi đi vμo vμ 1 đơn vị khi đi rạ Vậy mỗi đỉnh đều có bậc chẵn. Đủ: Nếu đồ thị lμ liên thông vμ mọi đỉnh của nó đền có bậc chẵn, khi đó nếu ta xuất phát từ một đỉnh a bất kỳ, do tính liên thông nên có cạnh từ đỉnh a đến đỉnh x1 nμo đó của đồ thị, tuy nhiên do bậc của x1 lμ chẵn nên phải có cạnh khác từ x1 đến x2, cứ nh− vậy sau hữu hạn b−ớc ta phải trở về đỉnh a (vì nếu không trở lại đỉnh a mμ phải dừng ở một đỉnh nμo đó khác a

thì bậc của đỉnh ấy sẽ lμ một số lẻ (mâu thuẫn với giả thiết). Nh− vậy ta đã tìm đ−ợc một chu trình.

Nếu chu trình nμy chứa tất cả các cạnh của G thì nó lμ chu trình Euler, nếu không, vì tính liên thông của G nên tồn tại một đỉnh d1 trong chu trình đã xét lμ đầu mút của một cạnh e1 không thuộc chu trình nμỵ Chọn

d1 lμ đỉnh xuất phát, theo cạnh e1 ta sẽ đi đến một đỉnh nμo đó của đồ thị, lập luận t−ơng tự trên ta tìm đ−ợc một chu trình mới xuất phát vμ kết thúc tại

d1. Ghép chu trình mới với chu trình cũ ta thu đ−ợc chu trinh lớn hơn (chứa nhiều cạnh hơn). Cứ tiếp tục nh− trên cho đến khi tất cả các cạnh của đồ thị đ−ợc đ−a vμo chu trình, ta sẽ thu đ−ợc chu trình Euler. −

Chứng minh b. sẽ đ−ợc thực hiện hoμn toμn t−ơng tự.

Từ chứng minh điểu kiện đủ ở trên ta xây dựng đ−ợc thuật toán tìm chu trình Euler trong đồ thị vô h−ớng G nh− sau

Thuật toán tìm chu trình Euler.

B−ớc 1. Chọn đỉnh đầu a bất kỳ;

B−ớc 2. Lập chu trình Ct xuất phát từ đỉnh a của đồ thị G vμ thu đ−ợc đồ thị mới G sau khi đã loại bỏ các cạnh của chu trình Ct;

B−ớc 3. Khi đang còn cạnh trong G thực hiện

B 3.1 Xác định đỉnh dính d (đỉnh trong chu trình Ct đang lμ đầu mút của cạnh không thuộc Ct).

B 3.2 Lập chu trình con Ctc xuất phát từ đỉnh d vμ thu đ−ợc đồ thị mới G sau khi đã loại bỏ các cạnh của chu trình con Ctc;

B 3.3 Ghép Ct với Ctc tại đỉnh dính d vμ coi chu trình mới thu đ−ợc lμ Ct;

BEGIN

write(’Cho so dinh: ’);readln(n); Nhapmatrke(w,n);

a:=1; {đỉnh đầu lμ đỉnh thứ nhất}

lapchtr(w,ct,a); { lập chu trình Ct (lμ mảng các đỉnh, với ct[-1] lμ độ dμi của chu trình) của đồ thị có ma trận kề lμ w với a lμ đỉnh đầu, w lμ ma trận kề của đồ thị còn lại sau khi đã bỏ đi các cạnh thuộc chu trình Ct. }

while not Hetcanh(w,n) do begin

d:=diemdinh(w1,w,n); { đỉnh dính giữa đồ thị w1 ban đầu vμ đồ thị w còn lại {

lapchtr(w,ctc,d);

ghep(ct,ctc,d); { ghép chu trình Ct với chu trình con Ctc tại đỉnh dính }

end;

for i:=0 to ct[-1] do write(ct[i]); readln;

END.

Với ch−ơng trình chính nh− trên, ta cần phải viết các ch−ơng trình con: nhập ma trận kề (trong đó cần kiểm tra ma trận kề nhập đã hợp lệ hay ch−a; hμm kiểm tra hết (hay còn cạnh); hμm tìm đỉnh dính; thủ tục ghép chu trình. Các ch−ơng trình con nμy đ−ợc thể hiện chi tiết nh− sau:

Function hople(a:imatr;n:byte):boolean; var i,j,k:byte; b:boolean; begin b:=true; for i:=1 to n do begin k:=0; for j:=1 to n do k:=k+a[i,j]; b:=b and (k mod 2=0); end; hople:=b; end;

var

i,u:byte; begin

repeat

writeln(’Nhap ma tran ke’); for i:=1 to n do

begin

for u:=1 to i-1 do begin write(’w[’,i,’,’,u,’]= ’);readln(w[i,u]); w[u,i]:=w[i,u]; end; w[i,i]:=0; end; until hople(w,n); end;

Procedure lapchtr(var w:imatr;var ct:bvtor;l:byte); var i,j,k:byte; begin k:=0; i:=l; ct[k]:=i; repeat j:=1;

while (w[i,j]=0) and (j<=n) do j:=j+1; { repeat j:=j+1 until (w[i,j]<>0 or j>n);}

if jĂ=n then begin w[i,j]:=w[i,j]-1; w[j,i]:=w[i,j]; k:=k+1; ct[k]:=j; i:=j; end; until i=l; ct[-1]:=k;

end; Function Hetcanh(a:imatr;n:byte):boolean; var i,j,k:byte; b:boolean; begin b:=true; for i:=1 to n do for j:=1 to i-1 do b:=b and (a[i,j]=0); Hetcanh:=b; end; Function diemdinh(w1,w:imatr;n:byte):byte; − var i,j,t1,t2:byte; begin i:=0; t1:=0; t2:=0; repeat i:=i+1; for j:=1 to n do begin t1:=t1+w1[i,j]; t2:=t2+w[i,j]; end until (t2<>0) and (t2<t1); diemdinh:=i; end;

Procedure ghep(var ct:bvtor; ctc:bvtor;i:byte); var j,k:byte; begin k:=1; while ct[k]<>i do inc(k); for j:=ct[-1] downto k+1 do ct[ctc[-1]+j]:=ct[j];

for j:=1 to ctc[-1] do ct[j+k]:=ctc[j]; ct[-1]:=ct[-1]+ctc[-1];

end;

Định lý 4. (về điều kiện cần vμ đủ để có đ−ờng đi Euler).

Cần vμ đủ để đồ thị vô h−ớng liên thông G có đ−ờng đi Euler vμ không có chu trình Euler lμ đồ thị có đúng hai đỉnh bậc lẻ.

Chứng minh. Giả sử đồ thị có đ−ờng đi Euler từ a đến b, a = b (không có chu trình Euler). Nếu một đỉnh v nμo đó thuộc đ−ờng đi nμy lμ đỉnh trong thì mỗi lần đ−ờng đi qua v, cạnh vμo vμ cạnh ra góp thêm 2 đơn vị (1 khi đi vμo vμ 1 khi đi ra) nên bậc của các đỉnh trong không phải lμ a hoặc b đều phải lμ các số chẵn. Riêng cạnh đầu tiên góp 1 đơn vị cho bậc của a (hoặc cạnh cuối góp 1 đơn vị cho bậc của b) khi xuất phát (hoặc khi kết thúc), do đó bậc của a vμ bậc của b đều lμ các số lẻ.

Ng−ợc lại, nếu đồ thị có đúng hai đỉnh bậc lẻ lμ a vμ b, a = b. Xét đồ thị mới G1 bằng cách bổ sung thêm vμo tập cạnh của G một cạnh có hai đỉnh kề lμ a vμ b thì trong G1 mọi đỉnh (kể cả a vμ b) đều có bậc chẵn, nên theo định lý 3 tồn tại một chu trình Euler chứa tất cả các cạnh của G1. Bỏ đi cạnh vừa đ−ợc bổ sung ta nhận đ−ợc đ−ờng đi Euler trong đồ thị G. −

Một phần của tài liệu Bài giảng toán rời rạc pptx (Trang 70 - 76)

Tải bản đầy đủ (PDF)

(88 trang)