Chu trinh Haminton de quy

3,447 views

Published on

Published in: Education, Sports
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,447
On SlideShare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
163
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Chu trinh Haminton de quy

  1. 1. Giáo viên hướng dẫn: TS. Hoàng Quang Nhóm 6: Nguyễn Mậu Quốc Hoàn Mai V ă n M ười Trần Thị Phương Chi Trương Thị Hương Huyền
  2. 2. NỘI DUNG TRÌNH BÀY <ul><li>Giới thiệu bài toán </li></ul><ul><li>Định nghĩa Chu trình Hamilton </li></ul><ul><li>Mô hình bài toán </li></ul><ul><li>Các bước giải quyết bài toán </li></ul><ul><li>Thủ tục mô tả thuật toán </li></ul><ul><li>Thời gian thực hiện </li></ul>
  3. 3. GIỚI THIỆU BÀI TOÁN <ul><li>Một người khách du lịch muốn đi thăm n thành phố được đánh số từ 1 đến n. Mạng lưới giao thông giữa n thành phố này là 2 chiều và được cho bởi ma trận A[i,j] trong đó A[i,j] = 1 nếu có đường đi giữa thành phố i và thành phố j, A[i,j] = 0 trong trường hợp ngược lại. Thiết lập đường đi cho người khách thông báo tồn tại đường đi hoặc không tồn tại đường đi. </li></ul>
  4. 4. ĐỊNH NGHĨA CHU TRÌNH HAMILTON <ul><li>Cho đồ thị G=(V, E) có n đỉnh </li></ul><ul><li>Chu trình (x 1 , x 2 , …, x n , x 1 ) được gọi là Chu trình Hamilton nếu x i <>x j với 1<=i<j<=n </li></ul><ul><li>Đường đi (x 1 , x 2 , …, x n ) được gọi là Đường đi Hamilton nếu x i <>x j với 1<=i<j<=n </li></ul><ul><li>Chu trình Hamilton là chu trình xuất phát từ một đỉnh, đi thăm tất cả những đỉnh còn lại, mỗi đỉnh đúng một lần, cuối cùng quay lại đỉnh xuất phát. </li></ul><ul><li>Đường đi Hamilton là đường đi qua tất cả các đỉnh của đồ thị, mỗi đỉnh đúng một lần. </li></ul>
  5. 5. VÍ DỤ VỀ CHU TRÌNH VÀ ĐƯỜNG ĐI HAMILTON Một đồ thị đầy đủ có nhiều hơn hai đỉnh là đồ thị Hamilton. Mọi đồ thị vòng là Hamilton. Đồ thị khối ba chiều là đồ thị Haminton.
  6. 6. MÔ HÌNH BÀI TOÁN (1) <ul><li>Ta có file: </li></ul><ul><ul><li>Input: Là file văn bản Input.pas </li></ul></ul><ul><ul><ul><li>Dòng 1 ghi số đỉnh n<=50 và số cạnh m của đồ thị cách nhau một dấu cách. </li></ul></ul></ul><ul><ul><ul><li>m dòng tiếp theo, mỗi dòng có dạng 2 số nguyên dương u, v cách nhau một dấu cách, thể hiện u, v là 2 đỉnh kề nhau trong đồ thị. </li></ul></ul></ul><ul><ul><li>Output: là file văn bản Output.pas </li></ul></ul><ul><ul><ul><li>Liệt kê tất cả các chu trình Hamilton </li></ul></ul></ul>
  7. 7. MÔ HÌNH BÀI TOÁN (2) 1 5 4 2 3 Input.pas Output.pas 5 7 1 2 1 4 2 3 2 5 3 4 3 5 4 5 1 2 3 5 4 1 1 2 5 3 4 1 1 4 3 5 2 1 1 4 5 3 2 1
  8. 8. CÁC BƯỚC GIẢI QUYẾT BÀI TOÁN <ul><li>Gán đỉnh đầu tiên bằng 1 </li></ul><ul><li>Thử các cách chọn đỉnh thứ i trong hành trình với i>=2 và i<=n. </li></ul><ul><ul><li>Chọn tất cả các đỉnh j để tìm đỉnh thứ i X[i] kề với X[i-1] và chưa bị đi qua </li></ul></ul><ul><ul><ul><li>Nếu tìm thấy đỉnh j thỏa mãn điều kiện trên thì gán X[i] = j . </li></ul></ul></ul><ul><ul><ul><li>Nếu i < n thì </li></ul></ul></ul><ul><ul><ul><ul><li>Đánh dấu đỉnh j là đã đi qua để cho các bước tiếp theo không chọn j nữa. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sau đó chọn đỉnh thứ i+1 trong hành trình </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Thử phương án khác cho X[i] nên sẽ bỏ đánh dấu đỉnh vừa thử </li></ul></ul></ul></ul><ul><ul><ul><li>Ngược lại , nếu đã thử chọn đến X[n] thì kiểm tra nếu X[n] lại kề với X[1] thì ta có chu trình Hamilton. </li></ul></ul></ul>
  9. 9. THỦ TỤC MÔ TẢ THUẬT TOÁN <ul><li>procedure Try (i: Integer); </li></ul><ul><li>var </li></ul><ul><li>j: Integer; </li></ul><ul><li>begin </li></ul><ul><ul><li>for j := 1 to n do </li></ul></ul><ul><ul><li>if Mask[j] and A[X[i - 1], j] then </li></ul></ul><ul><ul><li>begin </li></ul></ul><ul><ul><li>X[i] := j; </li></ul></ul><ul><ul><li>if i < n then </li></ul></ul><ul><ul><li>begin </li></ul></ul><ul><ul><li>Mask[j] := False; </li></ul></ul><ul><ul><li>Try(i + 1); </li></ul></ul><ul><ul><li>Mask[j] := True; </li></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>else </li></ul></ul><ul><ul><li>if A[j, X[1]] then Print; </li></ul></ul><ul><ul><li>end; </li></ul></ul><ul><li>end; </li></ul>Khai báo Const Max=50; Inputfilename=‘D:BPBININPUT.PAS’ Outputfilename=‘D:BPBINOUTPUT.PAS’ var ft: Text; A: array[1..max, 1..max] of Boolean; Mask: array[1..max] of Boolean; X: array[1..max] of Integer; n: Integer;
  10. 10. CÁC THỦ TỤC KHỞI TẠO (1) <ul><li>Nhập dữ liệu vào </li></ul><ul><li>procedure Inputdata ; </li></ul><ul><li>var </li></ul><ul><li>i, u, v, m: Integer; </li></ul><ul><li>fs: Text; </li></ul><ul><li>begin </li></ul><ul><li>Assign(fs, InputFilename); Reset(fs); </li></ul><ul><li>FillChar(A, SizeOf(A), False); </li></ul><ul><li>ReadLn(fs, n, m); </li></ul><ul><li>for i := 1 to m do </li></ul><ul><li>begin </li></ul><ul><li>ReadLn(fs, u, v); </li></ul><ul><li>a[u, v] := True; </li></ul><ul><li>a[v, u] := True; </li></ul><ul><li>end; </li></ul><ul><li>Close(fs); </li></ul><ul><li>end; </li></ul>In kết quả procedure Print; var i: Integer; begin for i := 1 to n do Write(ft, X[i], ' '); WriteLn(ft, X[1]); writeln; end;
  11. 11. CÁC THỦ TỤC KHỞI TẠO (2) <ul><li>Chương trình chính </li></ul><ul><ul><li>BEGIN </li></ul></ul><ul><ul><ul><li>Inputdata; </li></ul></ul></ul><ul><ul><ul><li>FillChar(Mask, SizeOf(Mask), True); </li></ul></ul></ul><ul><ul><ul><li>X[1] := 1; Mask[1] := False; </li></ul></ul></ul><ul><ul><ul><li>Assign(ft, Outputfilename); Rewrite(ft); </li></ul></ul></ul><ul><ul><ul><li>Try(2); </li></ul></ul></ul><ul><ul><ul><li>Close(ft); </li></ul></ul></ul><ul><ul><ul><li>readln; </li></ul></ul></ul><ul><ul><li>END. </li></ul></ul>
  12. 12. THỜI GIAN THỰC HIỆN T(n) = O(n*m) trong đó n là số đỉnh và m là số cạnh giữa các đỉnh 1 5 4 2 3 3 1 2 4 5 3 2 1 3 1 2 3 5 2 1 5 1 2 5 4 1 3 3 4 1 1 5 4 5 1 4 Đồ thị có 5 đỉnh và 7 cạnh Cây liệt kê chu trình Hamilton của đồ thị theo thuật toán quay lui

×