Chuyên đề Chu trình đường đi Hamilton Tin học các chuyên đề Tin học kỹ thuật lập trình. Cảm ơn mọi người đã xem. Hãy xem các tài liệu khác của Tài liệu học và thi. Chuyên đề Chu trình đường đi Hamilton Tin học các chuyên đề Tin học kỹ thuật lập trình. Cảm ơn mọi người đã xem. Hãy xem các tài liệu khác của Tài liệu học và thi
Trang 1Đuờng đi và Chu trình Hamilton
I Định nghĩa:
Một đường đi Hamilton là một đường đi qua tất cả các đỉnh, mỗi đỉnh đúng một lần
Một chu trình đi Hamilton là một chu trình đi qua tất cả các đỉnh, mỗi đỉnh đúng một
lần
Vídụ:
Hình 1.a: Đồ thị không có đường đi hay chu trình Hamilton
Hình 1.b: Đồ thị có đường đi Hamilton nhưng không có chu trình Hamilton
Hình 1.c: Đồ thị có chu trình Hamilton
Lưu ý:
-Đồ thị có chu trình Hamilton được gọi là đồ thị Hamilton
-Đồ thị có đường đi Hamilton được gọi là đồ thị nửa Hamilton
II Định lý
Định lý 1 (Dirak 1952):
Trong đồ thị vô hướng G có n đỉnh (n≥3), nếu mọi đỉnh v của G đều có deg(v)≥n/2 thì G có chu trình Hamilton
Định lý 2:
Trong đồ thị có hướng G liên thông mạnh và có n đỉnh, nếu deg+(v)≥n/2 và deg-(v)≥n/2 với mọi đỉnh v thì G có chu trình Hamilton
Đồ thị đấu loại:
Đồ thị đấu loại là đồ thị có hướng mà trong đó 2 đỉnh bất kỳ được nối
với nhau bởi 1 cung
Tên gọi đấu loại xuất hiện vì đồ thị như vậy có thể biểu diễn kết quả thi
đấu bóng chuyền, bóng bàn hay bất cứ môn thể thao nào mà không cho
phép hòa Ví dụ: Đồ thị đấu loại ở hình 2
Định lý 3:
3.1 Mọi đồ thị đấu loại là nửa Hamilton
3.2 Mọi đồ thị đấu loại lên thông mạnh là Hamilton
III Cài đăt
Dưới đây ta sẽ dùng phương pháp quay lui để cài đặt một chương trình liệt kê tất cả chu trình Hamilton xuất phát từ đỉnh 1 Các chu trình Hamilton khác có thể có được bằng cách hoán vị vòng quanh
Input: HAMILTON.INP gồm:
Dòng 1 ghi số đỉnh n (2<n≤20) và số cạnh m cách nhau bởi dấu cách
M dòng tiếp theo, mỗi dòng ghi 2 số nguyên u,v thể hiện u,v là 2 đỉnh kề nhau trong đồ thị Output: HAMILTON.OUT liệt kê các chu trình Hamilton, mỗi chu trình trên 1 dòng
Ví dụ
HAMILTON.INP HAMILTON.OUT
5 6
1 2
1 3
2 4
3 5
1 3 5 2 4 1
1 4 2 5 3 1
Hình 1.a
3
1
Hình 2
Trang 24 1
5 2
Program All_of_Hamiltin_circuits; //
const
inputfile='HAMILTON.INP';
outputfile='HAMILON.OUT';
Max=20;
Var
fo:text;
a:Array[1 Max,1 Max]of boolean;
Free:array[1 Max]of Boolean;
X:array[1 Max]of integer;
n,m:integer;
Procedure Enter;
Var i,u,v:integer;
f:text;
begin
Assign(f,inputfile); Reset(f);
Fillchar(a,sizeof(a),false);
Readln(f,n,m);
For i:=1 to m do
begin Readln(f,u,v); a[u,v]:=true; a[v,u]:=true; end;
close(f);
end;
Procedure PrintResult;
var i:integer;
Begin
for i:=1 to n do Write(fo,X[i],' ');
Writeln(fo,X[1]);
end;
Procedure Try(i:integer); // ThỬ cac cach chon dinh thu i trong hanh trinh
var j:integer;
begin
For j:=1 to n do//Dinh X[i] duoc chon trong cac dinh j chua di qua va ke voi x[i-1]
if Free[j] and a[x[i-1],j] then
begin
x[i]:=j;
if i<n then
begin
Free[j]:=false;
Try(i+1);
Free[j]:=true;
end
else if a[j,x[1]] then PrintResult;//x[n] ke x[1] nen co chu trinh Hamilton
end;
end;
begin//mAIN
Trang 3Enter;
Fillchar(Free,sizeof(Free),True);// Khoi tao tat cac dinh chua di qua
X[1]:=1; Free[1]:=false; // Bat dau di tu dinh 1
Assign(fo,outputfile); Rewrite(fo);
Try(2);
Close(fo);
end
Bài tập:
Bài toán Tưới cây
(Đề thi đề nghị OLYMPIC 30-4 của trường THPT Mạc Đỉnh Chi TPHCM)
Cù lao là một vùng đất nổi lên giữa vùng sông nước xung quanh
Trên một cù lao hình chữ nhật gồm MxN ô, tại một số ô Bờm có trồng cây Một số ô còn lại để đất trống
Mỗi lần tưới cây, Bờm lấy nước ở ngoài sông tại một vị trí bất kỳ rồi lần lượt tưới cho
đủ các ô có trồng cây và cuối cùng lại ra sông tại một vị trí bất kỳ Thời gian để tưới cây trong một ô không đáng kể Mỗi ô chỉ tưới một lần
Bờm di chuyển từ một ô sang ô kề cạnh mất 1 đơn vị thời gian Bờm có thể đi vào ô có cây (đã được tưới hoặc chưa được tưới) hoặc ô chưa có cây Bờm di chuyển từ dưới sông lên bờ (cù lao) hoặc ngược lại cũng mất 1 đơn vị thời gian
Yêu cầu:
Tìm thời gian T ngắn nhất để Bờm thực hiện một lần tưới cây theo mô tả ở trên
Dữ liệu vào: Cho trong file TuoiCay.inp
-Dòng đầu tiên ghi 3 số nguyên M N và K (0<N,M<=200) Trong đó K là số ô có trồng cây (0<K<=12)
-Trên K dòng tiếp theo, mỗi dòng ghi toạ độ của một ô có trồng cây
Dữ liệu ra : Ghi ra file TuoiCay.out
Gồm một số nguyên T duy nhất cần tìm
Ví dụ:
Tuoicay.inp TuoiCay.out
7 7 4
1 1
1 5
2 4
3 3
10
-oOo -