1. Trang chủ
  2. » Giáo án - Bài giảng

lý thuyết pascal phần ole

25 203 1

Đ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

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

Ngày đăng: 07/09/2014, 07:09

TỪ KHÓA LIÊN QUAN

w