Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 25 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
25
Dung lượng
136,5 KB
Nội dung
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ý 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ý : Đồ 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ý : (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ý : (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ý : 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ý : 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 II / Thuật toán Fleury tìm chu trình Euler ( trong đồ thị vô h ớng ): _______________________________ Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 9/7/2014 9/7/2014 23 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. III / Tìm đ ờng đi 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 ) IV / 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 : 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; 24 Tài liệu lớp 11 chuyên tin Hà Tây 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; 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; _______________________________ Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 9/7/2014 9/7/2014 25 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; 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 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; 26 Tài liệu lớp 11 chuyên tin Hà Tây For i:=1 to n do If (Bac(i) mod 2 = 1) then Inc(sbl); Sobacle := sbl; End; Procedure ChutrinhEuler; Var i,j,dem : 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; 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; End; _______________________________ Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 9/7/2014 9/7/2014 27 End; Inc(j); End; If Not Ok then { Phai qua cau, sang vung lien thong moi } Begin For j:=1 to n do { Tim lai cau de qua } If A[i,j]=1 then Begin A[i,j] := 0; { Qua cau } A[j,i] := 0; Inc(dem); chtr[dem] := j; i := j; Inc(Lt); { Gian tiep xoa diem co lap moi} Break; { Thoat sang vung moi thi quay ve B2 } End; 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 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); 28 Tài liệu lớp 11 chuyên tin Hà Tây 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 : Integer; Procedure DocF; Var i,j : Byte; F : Text; Begin Assign(F,Fi); Reset(F); Read(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; 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; F : Text; _______________________________ Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 9/7/2014 9/7/2014 29 Begin Assign(F,Fo); Rewrite(F); Writeln(F,'Mach Haminton : '); For j:=1 to N do Write(F,KQ[j]:4); Close(F); End; Procedure Lam; Var Ok : Boolean; i,d,c : Byte; Procedure Tim (i,d : Byte); Var j : Byte; Begin If d=c then Begin HienKq; Halt; End Else For j:=1 to N do If KT[j] and (A[i,j]=1 ) then Begin KT[j] := False; KQ[d] := j; Tim(j,d+1); KT[j] := True; End; End; Begin 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; 30 Tài liệu lớp 11 chuyên tin Hà Tây 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 Repeat Clrscr; DocF; Lam; Writeln('Khong ton tai mach Haminton ! . An phim ESC : thoat '); Until ReadKey=#27; END. 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 . _______________________________ Phần 2 : Đồ thị Ơle , đồ thị Hamintơn TDH 9/7/2014 9/7/2014 31 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 : 4 ) Tìm xâu nhị phân dài nhất mà mọi xâu con gồm k kí tự liên tiếp của nó chỉ xuất hiện đúng 1 lần Gợi ý : Bài toán tìm mạch Euler , tạo đồ thị gồm 2 k-1 đỉnh là các xâu nhị phân gồm k-1 kí tự 0,1 ; các cung là xâu nhị phân k kí tự đợc lập theo quy tắc : Nếu cung (i,j) là xâu (a 1 a 2 a k-1 ,a k ) thì đỉnh i là xâu (a 1 a 2 a k-1 ), đỉnh j là xâu (a 2 a 3 a k ) Thí dụ : cung (i,j) =0001 thì đỉnh i là 000 , đỉnh j là 001 . Do đồ thị liên thông và giả đối xứng nên tồn tại mạch Euler ,từ đó theo mạch tạo đợc xâu nhị phân thoả mãn đề bài (xâu này dài 2 k kí tự ) Chú ý : Để giải bài toán 3 ( N chi tiết máy trên 2 máy ) còn thuật toán JonhSon Tên chi tiết 1 2 3 4 Thời gian trên máy A 0.5 2 1.5 2 Thời gian trên máy B 1 1.5 1 3 T/T A B 1 0.5 1 2 2 1.5 3 1.5 1 4 2 3 32 4 1 2 3 [...]... bài 1 ) cho đồ thị có (1 shl (n-1)).(1 shl (n-1)) đỉnh đợc xây dựng nh đã nêu ở phần hớng dẫn ngay sau đề bài Cách 2 : Đệ quy xây dựng dãy nhị phân X gồm 2 n +n-1 số 0,1 : + n phần tử đầu là 0 + phần tử thứ i ( n+1 . ChutrinhEuler; Var i,j,dem : 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. 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 . Con:boolean; Var i,j:byte; Begin Con:=true; For i:=1 to n do For j:=1 to n do If A[i,j]=1 then exit; Con:=false; end; Procedure TimMachEuler; Var i,j,dd,llt,li1,lj1 : Integer; Tt,tt1 : Boolean; Begin