Tài liệu lớp 11 chuyên tin Hà Tây Phần 2 : Đồ thị Ơle, nửa Ơle Chu trình Ơle - Chu trình Hamintơn I / Định nghĩa : 1 - Trong đồ thị vô hớng : Đờng đi qua tất cả các cạnh, mỗi cạnh qua đúng 1 lần , gọi là đờng đi Euler. Chu trình đi qua tất cả các cạnh, mỗi cạnh qua đúng 1 lần , gọi là chu trình Euler. 2 - Đồ thị vô hớng có đờng đi Euler gọi là đồ thị nửa Euler Đồ thị vô hớng có chu trình Euler gọi là đồ thị Euler 3 - Định lý 1 ( Định lý Euler) : Đồ thị vô hớng,liên thông G là đồ thị Euler khi và chỉ khi mọi đỉnh đều có bậc chẵn . Đồ thị vô hớng , liên thông là đồ thị nửa Ơle khi và chỉ khi nó có không quá 2 đỉnh bậc lẻ . 4 - Trong đồ thị có hớng : Mạch đi qua mọi cung, mỗi cung chỉ 1 lần gọi là mạch Euler Đồ thị có hớng , nếu tại mỗi đỉnh số cung đi vào bằng số cung đi ra thì ta gọi đồ thị này là tựa đối xứng . Định lý 2 : Đồ thị có hớng,liên thông và tựa đối xứng thì có mạch Euler 5 - Trong đồ thị có hớng : Mạch đi qua tất cả các đỉnh , mỗi đỉnh chỉ 1 lần , gọi là mạch Hamintơn ; nếu mạch này đóng thì gọi là mạch đóng Hamintơn . Dây chuyền đơn đi qua tất cả các đỉnh , mỗi đỉnh chỉ 1 lần , gọi là dây chuyền đơn Haminton . đồ thị gọi là nửa Haminton . 6 - Trong đồ thị vô hớng : Đờng đi qua tất cả các đỉnh , mỗi đỉnh chỉ 1 lần , gọi là đờng đi Hamintơn ; chu trình đi qua tất cả các đỉnh , mỗi đỉnh chỉ 1 lần ( trừ đỉnh đầu trùng đỉnh cuối ) gọi là chu trình Hamintơn ; đồ thị tơng ứng cũng gọi là đồ thị nửa Haminton (vô hớng ) hoặc Haminton (vô hớng ) 7 - Định lý 3 : (Định lý Kơric) Nếu đồ thị đầy đủ ( giữa 2 đỉnh bất kỳ đều có ít nhất 1 cung ) thì tồn tại mạch Hamintơn 8 - Định lý 4 : ( Định lý Dirak) Đơn đồ thị vô hớng G có n đỉnh (n>=3) có bậc của mọi đỉnh đều >= n/2 thì đồ thị là Haminton. Đồ thị có hớng G có n đỉnh (n>=3) liên thông mạnh và có bán bậc vào , bán bậc ra của mọi đỉnh đều >= n/2 thì đồ thị là Haminton. 9 - Định lý 5 : Nếu đỉnh x chỉ có cung đi ra thì mọi mạch Hamintơn có đỉnh x là mút đầu tiên Nếu đỉnh y chỉ có cung đi vào thì mọi mạch Hamintơn có đỉnh y là mút cuối cùng 10 - Định lý 6 : Nếu x là đỉnh treo ( chỉ có 1 cung duy nhất dính với nó - đi tới nó hoặc từ nó đi ra - ) thì mọi đờng đi Hamintơn M đều có mút đầu tiên hoặc cuối cùng là x . Đỉnh kề với x trong đồ thị G cũng là đỉnh kề với x trong mạch Hamintơn M _______________________________ Đồ thị Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 11/2/2014 11/2/2014 51 II / Thuật toán Fleury tìm chu trình Euler ( trong đồ thị vô h ớng ): Bớc 1 : Xuất phát từ 1 đỉnh x i tuỳ ý . Bớc 2 : Vòng lặp + Chọn 1 cạnh xuất phát từ x i tới x k có tính chất : nếu xoá nó khỏi đồ thị thì phần đồ thị còn lại vẫn liên thông . ( gọi là tính chất A ) + Xoá cạnh đã chọn . + Gán x i := x k + Bớc 2 đợc lặp cho đến khi không chọn đợc cạnh có tính chất A nêu trên ; lúc này hoặc là hết cạnh hoặc cạnh đó là cầu sang vùng liên thông mới . Nếu hết cạnh thì kết thúc còn không thì sang bớc 3 Bớc 3 : Qua cầu , xoá điểm cô lập ( hoặc xử lý gián tiếp : tăng số vùng liên thông ) ,về b- ớc 2. Lu ý : Độ phức tạp của thuật toán trên là O(n 4 ) Một h ớng cải tiến : Nếu tất cả các đỉnh đều bậc chẵn thì : khi đã có một cạnh đi tới đỉnh này , ắt phải có một cạnh đi ra khỏi đỉnh này . Vì vậy có thể xuất phát từ 1 đỉnh tuỳ ý , bằng đệ quy tìm các cạnh đi tiếp , qua cạnh nào xoá cạnh ấy , cho đến khi số cạnh đi qua bằng số cạnh của đồ thị thì đ ợc 1 chu trình Ơle. III / Tìm đ ờng đi Euler : Tơng tự trên , chỉ chú ý : đờng đi Euler bắt đầu từ một đỉnh lẻ , kết thúc tại đỉnh lẻ còn lại . IV / Tìm mạch Hamintơn bằng đệ quy: Giả sử đã tìm đợc mạch k đỉnh , cần bổ xung đỉnh thứ k+1 vào chỗ thích hợp của mạch này , ta chọn 1 trong 3 trờng hợp sau : + Trờng hợp 1 : có cung nối x k với x k+1 thì cho mạch đi tiếp tới x k+1 + Trờng hợp 2 : có cung nối x k+1 tới x 1 thì thêm cung (x k+1 ,x 1 ) vào đầu mạch + Trờng hợp 3 : soát từ x k về đầu mạch cho đến khi gặp x m mà có cung nối x m với x k+1 thì chèn vào giữa mạch : cung (x m , x k+1 ) và cung (x k+1 ,x m+1 ) , bỏ cung (x m ,x m+1 ) Nếu điểm cuối của mạch nối đợc với điểm đầu của mạch thì mạch Hamintơn trở thành mạch đóng Hamin tơn Thuật toán trên áp dụng trên đồ thị vô hớng thì đợc đờng đi Hamintơn và chu trình Hamintơn. V / Bài tập cơ bản : 1 ) Cho đồ thị vô hớng Câu a ) Tìm các cầu của đồ thị . Câu b ) Hãy kiểm tra xem : 52 Tài liệu lớp 11 chuyên tin Hà Tây b1 - Có phải là đồ thị nửa Euler không ? Nếu là đồ thị nửa Euler thì hiện đờng đi Euler b2 - Có phải là đồ thị Euler không ? Nếu là đồ thị Euler thì hiện chu trình Euler. 2 ) Cho đồ thị có hớng . Tìm mạch Hamintơn nếu có . Bài 1 : Uses Crt; Const Max = 100; Fi = 'cau.inp'; Fo = 'cau.out'; Type Mang = Array[1 Max,1 max] of Integer; T_Q = Array[1 Max*max] of Byte; T_D = Array[1 Max] of Integer; Var A : Mang; N,sv : Byte; Q : T_Q; D : T_D; F : Text; Procedure MoFGhi; Begin Assign(F,Fo); Rewrite(F); End; Procedure DocF; Var F : Text; i,j : Byte; Begin Assign(F,Fi); Reset(F); Readln(F,n); For i:=1 to n do Begin For j:=1 to n do Read(F,A[i,j]); Readln(F); End; Close(F); End; Procedure HienF; Var i,j : Byte; Begin For i:=1 to n do Begin For j:=1 to n do Write(A[i,j]:2); Writeln; End; End; Procedure Loang(i : Byte); Var dau,cuoi,j,k : Byte; _______________________________ Đồ thị Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 11/2/2014 11/2/2014 53 Begin cuoi := 0; dau := 0; Inc(cuoi); Q[cuoi] := i; D[i] := sv; While (dau+1<=cuoi) do Begin Inc(dau); j := Q[dau]; For k:=1 to N do If (D[k]=0) and (A[j,k]=1) then Begin Inc(cuoi); Q[cuoi] := k; D[k] := sv; End; End; End; Function stplt : Integer; Var i,j : Byte; Ok : Boolean; Begin sv := 0; FillChar(D,sizeof(D),0); Repeat Ok := True; i := 0; For j:=1 to n do If D[j]=0 then Begin i := j;Break;End; If i>0 then Begin Inc(sv); Loang(i); Ok := False; End; Until Ok; stplt := sv; End; Procedure Cau; { C©u a } Var i,j : Byte; s,s2 : Integer; Begin Writeln(F,'Cac cau cua do thi : '); s := stplt; For i:=1 to n do For j:= 1 to n do 54 Tài liệu lớp 11 chuyên tin Hà Tây If (A[i,j]=1) then Begin A[i,j] := 0; s2 := stplt; If s2 = s+1 then Writeln(F,'(',i:2,',',j:2,')'); A[i,j] := 1; End; End; Function Sobacle : Integer; Var i : Byte; sbl : Integer; Function Bac(i : Byte) : Integer; Var j,b : Integer; Begin b := 0; For j:=1 to n do Inc(b,A[i,j]); Bac := b; End; Begin Sbl := 0; For i:=1 to n do If (Bac(i) mod 2 = 1) then Inc(sbl); Sobacle := sbl; End; Procedure ChutrinhEuler; { Câu b_2 } Var i,j,dem : Byte; Lj : Byte; Lt : Integer; chtr : Array[1 Max] of Byte; Ok : Boolean; Function Ketthuc : Boolean; Var i,j : Byte; Begin For i:=1 to n do For j:=i+1 to n do If A[i,j]=1 then Begin Ketthuc := False; Exit; End; Ketthuc := True; End; Begin FillChar(chtr,Sizeof(chtr),0); i := 1; dem := 1; chtr[dem] := i; { Nếu là câu b_1 then i là đỉnh lẻ thứ nhất } _______________________________ Đồ thị Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 11/2/2014 11/2/2014 55 Lt := 1; Repeat Ok := False; j := 1; While (j<=n ) do Begin If A[i,j]=1 then Begin A[i,j] := 0; {xoa canh } A[j,i] := 0; If stplt=Lt then { da xoa dung canh khong la cau } Begin Inc(dem); chtr[dem]:= j; i := j; Ok := True; Break; End Else { da xoa nham canh la cau, phai xay lai canh} Begin A[i,j] := 1; A[j,i] := 1; Lj := j; End; End; Inc(j); End; If Not Ok then { Phai qua cau, sang vung lien thong moi } Begin A[i,Lj] := 0; A[Lj,i] := 0; Inc(dem); ch[dem] := Lj; i := Lj; Inc(LT); End; Until Ketthuc; Writeln(F,'Chu trinh Euler : '); For i:=1 to dem-1 do Write(F,chtr[i]:2,' ->'); Writeln(F,chtr[dem]:2); End; Procedure Phanloai; Var sbl : Integer; Begin If stplt>1 then Writeln(F,'Do thi khong lien thong ') Else 56 Tài liệu lớp 11 chuyên tin Hà Tây Begin sbl := sobacle; If sbl=0 then Begin Writeln(F,'Do thi Euler '); ChutrinhEuler; End Else If sbl=2 then Writeln(F,'Do thi nua Euler ') Else Writeln(F,'Do thi lien thong , khong Euler , khong nua Euler '); End; End; BEGIN Clrscr; DocF; MoFghi; Cau; Phanloai; Close(F); END. Bài 2 : Uses Crt; Const Max = 20; Fi = 'Hmt.inp'; Fo = 'HMT.out'; Type M1 = Array[1 Max,1 Max] of 0 1; M2 = Array[1 max] of Byte; M3 = Array[1 Max] of Boolean; Var A : M1; KQ : M2; KT : M3; N,dem : Integer; F : Text; Procedure DocF; Var i,j : Byte; F : Text; Begin Assign(F,Fi); Reset(F); Readln(F,N); For i:=1 to N do Begin For j:=1 to N do Read(F,A[i,j]); Readln(F); End; Close(F); _______________________________ Đồ thị Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 11/2/2014 11/2/2014 57 End; Function Ra(i : Byte) : Boolean; Var j : Byte; Begin Ra := True; For j:=1 to n do If KT[j] and (A[i,j]=1) then Exit; Ra := False; End; Function Vao(i : Byte) : Boolean; Var j : Byte; Begin Vao := True; For j:=1 to n do If KT[j] and (A[j,i]=1) then Exit; Vao := False; End; Procedure HienKQ; Var j : Byte; Begin Inc(dem); Write(F,'Mach dong Haminton : '); For j:=1 to N do Write(F,KQ[j]:4); Writeln(F); End; Procedure Lam; Var Ok : Boolean; i,d,c,Luu : Byte; Procedure Tim (i,d : Byte); Var j : Byte; Begin If d=c then Begin If A[kq[N],kq[1]]=1 then HienKq; End Else For j:=1 to N do If KT[j] and (A[i,j]=1 ) then Begin KT[j] := False; Luu := KQ[d]; KQ[d] := j; Tim(j,d+1); KT[j] := True; KQ[d] := Luu; End; End; Begin 58 Tài liệu lớp 11 chuyên tin Hà Tây FillChar(KT,Sizeof(KT),True); OK := True; d := 0; c := N+1; While OK do Begin Ok := False; For i:=1 to N do {Tim dau mach } If KT[i] and (Not Vao(i)) and (Ra(i)) then Begin Ok := True; KT[i] := False; Inc(d); Kq[d] := i; End Else {Tim cuoi mach } If KT[i] and (Vao(i)) and (Not Ra(i)) then Begin Ok := True; KT[i] := False; Dec(c); Kq[c] := i; End End; If d=0 then Tim(1,1) { Tiep tuc tim tu dau mach } Else Tim(Kq[d],d+1); { Tiep tuc tim tu giua mach } End; BEGIN Clrscr; Dem := 0; DocF; Assign(F,Fo); Rewrite(F); Lam; Close(F); If dem=0 then Writeln('Khong ton tai mach Haminton ! '); Writeln('Da xong . Xem ket qua trong file ',Fo); Readln; END. _______________________________ Đồ thị Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 11/2/2014 11/2/2014 59 Bài tập 1) Tìm mạch Euler trong đồ thị có hớng,liên thông,tựa đối xứng . 2 ) Trong một nhà máy hoá chất , chỉ dùng 1 thiết bị sản xuất ( thí dụ nh : lò phản ứng hoá chất ) để lần lợt điều chế N hoá chất , mỗi lần chuyển từ công việc điều chế hoá chất H i sang điều chế hoá chất mới là H k ,phải điều chỉnh lại thiết bị sản xuất cho phù hợp điều chế hoá chất mới . Gọi chi phí điều chỉnh từ H i sang H k là P ik . Giả sử chi phí điều chỉnh P ik chỉ nhận giá trị 0 ,1 với ý nghĩa : P ik =0 nếu không phải điều chỉnh , P ik =1 nếu phải điều chỉnh. Hãy tìm một quy trình sản xuất , để sản xuất đủ N hoá chất , mỗi hoá chất 1 lần , mà không tốn chi phí điều chỉnh thiết bị sản xuất . 3 ) Một nhà máy in sử dụng 2 máy A và B để hoàn thành N cuốn sách : Máy A in sách , máy B đóng sách . Thời gian làm cuốn sách k trên máy A và B tơng ứng là a k và b k (k=1 n) với điều kiện phải qua máy A rồi mới qua máy B ( in cuốn sách k xong rồi mới đóng nó ). Ngời ta chứng minh đợc định lý sau : Nếu Min{a k , b m }<= Min{a m , b k } thì phải làm cuốn sách k trớc cuốn m Hãy tìm một trình tự in sách để tổng thời gian chờ đợi của máy B là ít nhất . Gợi ý : Mỗi cuốn sách là 1 đỉnh đồ thị , thứ tự in là cung . Từ bảng A,B , dựa vào định lý trên , lập đồ thị G , cung (k,m) thể hiện cuốn sách k làm trớc cuốn sách m . Vì phải hoàn thành toàn bộ các cuốn sách nên ta phải tìm mạch Hamintơn của đồ thị . Thí dụ : Min(a1,b4) = 0.5 Min(a4,b1) = 1 Do đó sách 1 làm trớc sách 4 Đáp số : Thứ tự làm các cuốn sách theo mạch Hamintơn : T/T A B 1 0.5 1 2 2 1.5 3 1.5 1 4 2 3 60 4 1 2 3 [...]... của hành trình là đỉnh i và tập các đỉnh còn lại là tập , khi đó ta qui ớc G(i, ) là C i 1 vì tới đỉnh cuối cùng là i thì chỉ còn cạnh (i,1 ) cha qua Thí dụ : _ Đồ thị Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 11/2/2014 11/2/2014 62 Ma trận C(3,3) 10 1 3 5 2 15 9 8 3 0 5 3 10 0 8 15 9 0 G(2, )=5 ; G(3, )=3 G(2,[3])=C23+ G(3, )=12; G(3,[2])=C32+G(2,)=13 G(1,[2,3])=Min{C12+ G(2,[3])... Begin D:=0;c:=1;q[c]:=i;dx[i]:=true; While D . Tài liệu lớp 11 chuyên tin Hà Tây Phần 2 : Đồ thị Ơle, nửa Ơle Chu trình Ơle - Chu trình Hamintơn I / Định nghĩa : 1 - Trong đồ thị vô hớng : Đờng đi qua tất. thị Euler khi và chỉ khi mọi đỉnh đều có bậc chẵn . Đồ thị vô hớng , liên thông là đồ thị nửa Ơle khi và chỉ khi nó có không quá 2 đỉnh bậc lẻ . 4 - Trong đồ thị có hớng : Mạch đi qua mọi cung,. là đỉnh kề với x trong mạch Hamintơn M _______________________________ Đồ thị Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 11/2/2014 11/2/2014 51 II / Thuật toán Fleury tìm chu trình Euler ( trong