Chu trình đi qua tất cả các cạnh, mỗi cạnh qua đúng 1 lần , gọi là chutrì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à
Trang 1Phần 2 : Đồ thị Ơle, nửa ƠleChu 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à chutrì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ạchHamintơn ; nếu mạch này đóng thì gọi là mạch đóng Hamintơn Dây chuyền đơn đi quatấ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ửaHaminton
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ì
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 ):
Trang 2Bớ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 xk với xk+1 thì cho mạch đi tiếp tới xk+1
+ Trờng hợp 2 : có cung nối x k+1 tới x1 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 xm
với xk+1 thì chèn vào giữa mạch : cung (xm , xk+1) và cung (xk+1,x m+1) , bỏ cung (xm ,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 Eulerb2 - 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ó
Trang 3Procedure Loang(i : Byte);
Var dau,cuoi,j,k : Byte;
Trang 4Var i,j : Byte;
Trang 5Function Ketthuc : Boolean;
Var i,j : Byte;
Trang 6Inc(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,' ->');
Trang 8For i:=1 to N do {Tim dau mach }
If KT[i] and (Not Vao(i)) and (Ra(i)) then Begin
Else {Tim cuoi mach }
If KT[i] and (Vao(i)) and (Not Ra(i)) then Begin
Ok := True;
KT[i] := False;
Trang 92 ) 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 ứnghoá 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
Hi sang điều chế hoá chất mới là Hk ,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ừ Hi sang Hk là P ik Giả sử chi phí điềuchỉnh Pik chỉ nhận giá trị 0 ,1 với ý nghĩa : Pik=0 nếu không phải điều chỉnh , Pik =1 nếuphả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
Trang 103 ) 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à ak và bk
(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{ak , bm}<= Min{a m , bk} 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 2k-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 (a1a2 ak-1,ak) thì đỉnh i là xâu (a1a2 ak-1), đỉnh j là xâu (a2a3 ak)
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 2k 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
4
3
Trang 11Thứ tự thực hiện các chi tiết 1 4 2 3
Tìm giá trị nhỏ nhất trong tất cả các giá trị thời gian thực hiện trên máy A , máy
B của các chi tiết còn lại , nếu giá trị nhỏ nhất này thuộc về máy A thì xếp tiếp tên chitiết máy vào đoạn đầu hành trình , ngợc lại nếu thuộc về máy B thì xếp tiếp tên chi tiếtmáy vào phần cuối hành trình , sẽ đợc kết quả là dòng 4 trong bảng trên : 1→ 4 → 2 →
C i 1 vì tới đỉnh cuối cùng là i thì chỉ còn cạnh (i,1 ) cha qua
Trang 12Bµi 1 ) Lêi gi¶i Lª Hång ViÖt ( 11 CT 1997-98 ) :
{$A+,B-,D+,E+,F-,G-,I-,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+}{$M 16384,0,655360}
Trang 13While dx[i] do inc(i);
If i>n then tt:=true;
If a[i,j]=1 then inc(ra);
If a[j,i]=1 then inc(va);
Trang 16Function Min(var p:Byte): Byte;
Var i,j,lc:byte;Lgt : Real;
Trang 17Cách 1 : áp dụng bài tìm mạch Euler ( 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 2n +n-1 số 0,1 :
+ n phần tử đầu là 0
+ phần tử thứ i ( n+1 <= i <= 2n +n-1 ) chọn trong 2 khả năng 0,1 sao cho dãy :X[i-n+1], X[i-n+2], , X[i] là 1 dãy nhị phân có n phần tử cha có mặt lần nào kể từ vị trí 1 tới i
Cách 3 : Nh cách 2 , nhng dùng vòng lặp thay đệ quy
Cách 1 chơng trình chỉ chạy tới N =7
Trang 18Begin Write('Nhap N : '); Readln(N); End;
Function Tinh(k : Word) : Word;
Var x,i : Integer;
For i:=k Downto k-N+1 Do
If A^[i]=1 then x:=x or (1 Shl (k-i));
WRiteln(F,'Do dai cua xau : ',1 Shl N+N-1 );
For i:=1 to 1 Shl N+N-1 do Write(F,A^[i]);
Trang 19Type Mang = Array[0 max] of Shortint;
Var A,Dd : Mang;
Function Tinh(k : Word) : Word;
Var x,i : Word;
Begin
x:=0;
For i:=k downto k-N+1 do
Trang 20If A[i]=1 then x:=x or (1 Shl (k-i));
Sau đây là 2 cách giải của Phạm phú Trung 11CT 1997-1998
Cách 1 : Đệ quy ( chỉ chạy với đồ thị số đỉnh nhỏ )
Program Haminton;
Uses Crt;
Const Fi = 'Haminton.dat';
Fo = 'Vet.out';
Trang 22Writeln(F,'Chi phi min la : ',lt);
For i:=1 to N do Write(F,Lkq[i]:4); Writeln(F,1:4); Close(F);
Trang 23Var B : Array [1 max,1 max] Of Kmang;
A : Array [1 max,1 max] Of Integer;
Trang 25Writeln(F,'Chu trinh haminton : ',min);
For i:=1 to N do Write(F,B[i,lj].ten:4); Writeln(F,lj:4);