Tải bản đầy đủ

Chuyên đề Chu trình Đường đi Hamilton

Đ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ụ:

1

2
Hình 1.a

3

4
Hình 1.b

Hình 1.c

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
Hình 2
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 (2M 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
56
135241
12
142531
13
24
35




41
52
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;
close(f);
end;

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 ibegin
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


Enter;
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 (0trồng cây (0-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
774
10
11
15
24
33
---oOo---



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×
x