1. Trang chủ
  2. » Giáo Dục - Đào Tạo

[Hcmut] Bài tập lớn Đại số tuyến tính lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code

43 5 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Lý Thuyết Đồ Thị (Chu Trình Euler Và Chu Trình Hamilton)
Người hướng dẫn ThS. Nguyễn Hữu Hiệp
Trường học Trường Đại Học Bách Khoa - ĐHQG TP.HCM
Chuyên ngành Khoa Học Ứng Dụng
Thể loại Bài tập lớn
Năm xuất bản 2025
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 43
Dung lượng 783,75 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • CHƯƠNG 1. GIỚI THIỆU LÝ THUYẾT ĐỒ THỊ (8)
    • 1.1. Đồ thị (Graph) (8)
    • 1.2. Các loại đồ thị (8)
    • 1.3. Ma trận kề của đồ thị (Adjacency Matrix) (11)
      • 1.3.1. Định nghĩa (11)
      • 1.3.2. Biểu diễn đồ thị bằng ma trận kề (11)
      • 1.3.3. Tính chất của ma trận kề (11)
      • 1.3.4. Ứng dụng (12)
      • 1.3.5. Ưu điểm và nhược điểm (12)
    • 1.4. Đồ thị liên thông (Connected Graph) (13)
      • 1.4.1. Định nghĩa (13)
      • 1.4.2. Tính chất (14)
      • 1.4.3. Định lý (16)
    • 1.5. Chu trình (17)
      • 1.5.1. Chu trình chẵn (18)
      • 1.5.2. Chu trình lẻ (18)
      • 1.5.3. Chu trình có hướng (19)
      • 1.5.4. Chu trình đơn (19)
      • 1.5.5. Chu trình sơ cấp (20)
      • 1.5.6. Chu trình Euler (20)
      • 1.5.7. Chu trình bao trùm (Chu trình Hamilton) (21)
  • CHƯƠNG 2. CHU TRÌNH EULER (23)
    • 2.1. Định nghĩa (23)
    • 2.2. Định lý (23)
      • 2.2.1. Định lý 1 (23)
      • 2.2.2. Định lý 2 (24)
    • 2.3. Điều kiện có chu trình Euler (24)
    • 2.4. Thuật toán tìm chu trình Euler (25)
    • 2.5. Ứng dụng chu trình Euler vào bài toán thực tế (26)
  • CHƯƠNG 3. CHU TRÌNH HAMILTON (26)
    • 3.1. Định nghĩa (26)
    • 3.2. Điều kiện (27)
    • 3.3. Thuật toán quay lui (Backtracking) tìm chu trình Hamilton (28)
    • 3.4. Ứng dụng chu trình Hamilton vào bài toán thực tế (29)
  • CHƯƠNG 4. ỨNG DỤNG LẬP TRÌNH PYTHON (33)
    • 4.1. Code (33)
    • 4.2. Thuật toán chạy code (37)
    • 4.3. Thuật toán Dijkstra (39)
  • CHƯƠNG 5. KẾT LUẬN (42)
    • 5.1. Tổng kết ứng dụng (42)
    • 5.2. Thách thức và hướng phát triển (42)
  • TÀI LIỆU THAM KHẢO (43)

Nội dung

[Hcmut] btl Đại số tuyến tính lý thuyết Đồ thị [Hcmut] btl Đại số tuyến tính lý thuyết Đồ thị [Hcmut] btl Đại số tuyến tính lý thuyết Đồ thị Chu trình Euler, chu trình Hamilton CÓ CODE PYTHON

GIỚI THIỆU LÝ THUYẾT ĐỒ THỊ

Đồ thị (Graph)

Đồ thị bao gồm hai tập hợp E và V, trong đó V chứa các đỉnh (vertices) và E chứa các cạnh (edges) Mỗi cạnh trong đồ thị tương ứng với hai đỉnh.

 V là tập hợp hữu hạn các đỉnh.

 E là tập hợp các cạnh, có thể có hướng hoặc không có hướng.

 Đồ thị có số đỉnh và số cạnh hữu hạn là đồ thì hữu hạn và ngược lại.

Các loại đồ thị

Đồ thị vô hướng là loại đồ thị trong đó mỗi cạnh kết nối hai đỉnh mà không có hướng xác định Cụ thể, nếu có một cạnh nối giữa hai đỉnh u và v, thì không phân biệt hướng đi của cạnh đó; nó chỉ đơn giản thể hiện mối quan hệ trực tiếp giữa hai đỉnh này.

Hình 1: Đồ thị vô hướng Đặc điểm:

 Các cạnh là cặp không có thứ tự: (u,v) ≡ (v,u).

 Đồ thị được biểu diễn bằng cách nối hai đỉnh bằng một đoạn thẳng.

 Nếu hai đỉnh có nhiều hơn một cạnh nối, đồ thị đó được gọi là đa đồ thị; nếu không, gọi là đồ thị đơn. b/ Đồ thị có hướng

Đồ thị có hướng là loại đồ thị trong đó mỗi cạnh không chỉ nối hai đỉnh mà còn có một hướng xác định Cạnh từ đỉnh \(u\) đến đỉnh \(v\) được ký hiệu là \((u,v)\) và khác với \((v,u)\).

Hình 2: Đồ thị có hướng Đặc điểm:

 Các cạnh là cặp có thứ tự: (u,v) ≠ (v,u).

 Đồ thị được biểu diễn bằng các mũi tên chỉ hướng.

 Mỗi đỉnh có thể có: số lượng cạnh đi vào đỉnh hoặc số lượng cạnh đi ra từ đỉnh. c/ Đồ thị có trọng số

Đồ thị có thể là vô hướng hoặc có hướng, với mỗi cạnh được gán một giá trị số gọi là trọng số Trọng số này có thể đại diện cho độ dài, chi phí, thời gian hoặc công suất.

Hình 3: Đồ thị có trọng số trên các cạnh Đặc điểm:

 Mỗi cạnh (u,v)(u,v)(u,v) gắn với một trọng số w(u,v)w(u,v)w(u,v).

Trọng số có thể là dương, âm hoặc bằng 0 Đồ thị đơn là một loại đồ thị vô hướng đặc biệt, trong đó không có cạnh lặp (giữa hai đỉnh bất kỳ chỉ có tối đa một cạnh) và không có cạnh khuyên (cạnh nối một đỉnh với chính nó).

 Đồ thị đơn giản nhất, ít phức tạp nhất.

Đồ thị đa thường được sử dụng để thiết kế các bài toán cơ bản Đồ thị này có thể là vô hướng hoặc có hướng, và giữa hai đỉnh bất kỳ có thể tồn tại nhiều cạnh song song.

 Có thể tồn tại nhiều cạnh giữa cùng một cặp đỉnh.

 Có thể có cạnh khuyên (nối đỉnh với chính nó).

Ma trận kề của đồ thị (Adjacency Matrix)

Ma trận kề, hay còn gọi là ma trận liền kề, là một phương pháp biểu diễn đồ thị dưới dạng ma trận vuông có kích thước n x n, trong đó n là số lượng đỉnh của đồ thị Giá trị của phần tử tại hàng i, cột j trong ma trận kề sẽ thể hiện mối quan hệ giữa các đỉnh.

, nếu tồn tại cạnh nối giữa hai đỉnh i và j

, nếu không có cạnh nối

Hình 4: Ma trận kề của một đồ thị có hướng

1.3.2 Biểu diễn đồ thị bằng ma trận kề

 Đồ thị vô hướng: Ma trận kề của nó là ma trận đối xứng, tức là

Đồ thị có hướng được mô tả bằng ma trận kề không đối xứng, trong đó các phần tử thể hiện mối quan hệ theo hướng cụ thể giữa hai đỉnh.

1.3.3 Tính chất của ma trận kề

 Ma trận kề của đồ thị vô hướng:

 Tổng các phần từ trên hàng i (cột j) bằng bậc của đỉnh i (đỉnh j)

 Ma trận kề của đồ thị có hướng:

 Không có tính đối xứng

 Tổng các phần từ trên dòng i bằng bán bậc ra của đỉnh i (deg+(i))

 Tổng các phần từ trên cột j bằng bán bậc vào của đỉnh j (deg-(j))

Trong thực tế, ma trận kề thường được sử dụng trong:

 Xây dựng bảng định tuyến trong mạng máy tính.

 Giải quyết các bài toán tìm đường đi ngắn nhất (ví dụ: thuật toán Dijkstra).

 Phân tích cấu trúc đồ thị trong lĩnh vực khoa học dữ liệu, mạng xã hội.

1.3.5 Ưu điểm và nhược điểm

Hiệu suất thời gian của các phép toán cơ bản như thêm cạnh, xóa cạnh và kiểm tra sự tồn tại của cạnh giữa hai đỉnh i và j được thực hiện một cách hiệu quả.

Khi làm việc với đồ thị dày đặc, ma trận kề là lựa chọn tối ưu nhờ khả năng tiết kiệm bộ nhớ và thực hiện các thao tác một cách nhanh chóng.

Cấu trúc dữ liệu đa dạng cho phép biểu diễn hiệu quả các đồ thị và ma trận kề thưa, ngay cả khi số lượng cạnh ít.

Sử dụng phần cứng một cách hiệu quả, đặc biệt là với sự phát triển của GPU, giúp thực hiện các phép toán trên ma trận kề lớn một cách nhanh chóng và hiệu quả.

Hiểu biết về đồ thị thông qua các phép toán trên ma trận kề giúp chúng ta nắm bắt cấu trúc và mối quan hệ giữa các đỉnh trong đồ thị một cách rõ ràng hơn.

Ma trận kề yêu cầu một không gian lưu trữ lớn để chứa thông tin về tất cả các cạnh giữa các đỉnh, dẫn đến việc tiêu tốn nhiều bộ nhớ Kích thước của ma trận là \$V \times V\$ (với \$V\$ là số lượng đỉnh), điều này gây áp lực lớn lên bộ nhớ, đặc biệt khi đồ thị có kích thước lớn.

Đồ thị thưa thường không hiệu quả do số lượng cạnh thực tế ít hơn nhiều so với số lượng cạnh có thể có trong đồ thị đầy đủ Điều này dẫn đến việc ma trận kề trở nên kém hiệu quả trong việc lưu trữ và thao tác, vì nhiều vị trí trong ma trận không chứa giá trị.

Các thao tác truy vấn danh sách các cạnh đi vào (inEdges) hoặc đi ra (outEdges) của một đỉnh cụ thể trong ma trận kề sẽ rất tốn kém, vì cần phải duyệt qua toàn bộ hàng hoặc cột tương ứng để lấy thông tin.

Đồ thị liên thông (Connected Graph)

1.4.1 Định nghĩa Đồ thị liên thông (Connected Graph) là một đồ thị vô hướng trong đó tồn tại ít nhất một đường đi giữa mọi cặp đỉnh bất kỳ Nói cách khác, trong một đồ thị liên thông, bạn có thể bắt đầu từ bất kỳ đỉnh nào và đi đến được mọi đỉnh còn lại thông qua một chuỗi các cạnh Ngược lại, đồ thị này được gọi là không liên thông (disconnected)

Hình 5: Các đồ thị liên thông

Cho đồ thị G = (X,U) vô hướng hay có hướng Ta định nghĩa một quan hệ tương đương như hệ sau trên tập đỉnh X:

Với mọi i, j thuộc X, i xấp xỉ j i = j hay có dây chuyền đỉnh đầu là i và đỉnh cuối là j.

Quan hệ này có ba tính chất chính: phản xạ, đối xứng và bắc cầu, do đó nó được coi là một quan hệ tương đương Kết quả là tập X được phân hoạch thành các lớp tương đương.

 Một thành phần liên thông của đồ thị là một lớp tương đương được xác định bởi quan hệ "xấp xỉ" nói trên;

 Số thành phần liên thông của đồ thị là số lượng các lớp tương đương;

 Một đồ thị liên thông là 1 đồ thị chỉ có 1 thành phần liên thông.

1.4.2 Tính chất a Đồ thị liên thông vô hướng

Một đồ thị vô hướng G = (V,E) được gọi là liên thông nếu với mọi cặp đỉnh u,v V (trong đó u = v), tồn tại một đường đi giữa u và v ∈

Hình 6: Đồ thị liên thông vô hướng

Trong đồ thị vô hướng, mọi đỉnh đều có thể kết nối với nhau, cho phép di chuyển từ đỉnh này sang đỉnh khác Chẳng hạn, từ đỉnh A đến đỉnh G, bạn có thể đi qua các đường A-D-F-G hoặc A-B-C-E-G Vì vậy, đồ thị này được xác định là một đồ thị liên thông.

Một số đồ thị vô hướng phải kể đến như:

Đỉnh khớp trong một đồ thị vô hướng là đỉnh mà khi bị xóa cùng với các cạnh kết nối, số thành phần liên thông của đồ thị sẽ tăng lên.

 Cạnh cầu: Của một đồ thị vô hướng là cạnh mà nếu xóa đi khỏi đồ thị thì số thành phần liên thông của đồ thị sẽ tăng thêm.

 Đồ thị song liên thông: Là đồ thị không chứa đỉnh khớp.

Đồ thị liên thông có hướng G=(V,A) bao gồm hai khái niệm liên thông chính, trong đó A là tập hợp các cung có hướng.

Một đồ thị có hướng được gọi là liên thông mạnh khi với mọi cặp đỉnh \( u, v \) thuộc tập hợp \( V \), tồn tại một đường đi có hướng từ \( u \) đến \( v \) và ngược lại, từ \( v \) đến \( u \).

Hình 8: Đồ thị liên thông mạnh

Trong đồ thị này, bạn có thể di chuyển giữa bất kỳ hai đỉnh nào theo hướng của các mũi tên Chẳng hạn, bạn có thể đi từ đỉnh A đến đỉnh C qua đỉnh B (A→B→C) và ngược lại, từ đỉnh C đến đỉnh A qua đỉnh D (C→D→A).

Một đồ thị có hướng được coi là liên thông yếu khi đồ thị vô hướng thu được từ việc bỏ qua hướng của tất cả các cung trong đồ thị đó là liên thông Điều này có nghĩa là nếu xem các cạnh như không có hướng, đồ thị kết quả vẫn phải đảm bảo tính liên thông.

Đồ thị liên thông yếu không có tính liên thông mạnh do thiếu đường đi từ đỉnh C đến đỉnh B theo hướng mũi tên Tuy nhiên, khi bỏ qua hướng, mọi cặp đỉnh vẫn có thể kết nối với nhau, chẳng hạn như từ C đến D và sau đó đến B.

Do đó, nó là liên thông yếu.

Một đồ thị có hướng được coi là liên thông một phần khi với mọi cặp đỉnh \(u\) và \(v\) trong tập hợp \(V\), tồn tại ít nhất một đường đi có hướng từ \(u\) đến \(v\) hoặc từ \(v\) đến \(u\) (hoặc cả hai).

Hình 10: Đồ thị liên thông một phần

Trong đồ thị này, tồn tại đường đi từ C đến B (C→A→B) và từ D đến E, nhưng không có đường đi từ B đến C Đồng thời, không có đường đi giữa tập {A, B, C} và tập {D, E} theo cả hai hướng Đối với cặp (C, D), có đường đi từ D đến E, nhưng không có đường đi từ C đến D hoặc ngược lại Tuy nhiên, với mọi cặp đỉnh, luôn có ít nhất một đường đi theo một hướng nào đó.

Cho G là một đồ thị đơn có n đỉnh, m cạnh và k thành phần liên thông Khí đó:

Chu trình

Theo lý thuyết đồ thị, chu trình là một đường đi đóng trong đồ thị Đồ thị có một chu trình với n đỉnh được gọi là đồ thị vòng, ký hiệu là

Hình 11: Một đồ thị đơn có chu trình

Chu trình gồm có 7 loại:

- Chu trình chẵn: là chu trình có độ dài chẵn.

- Chu trình lẻ: là chu trình có độ dài lẻ.

Chu trình có hướng là một chu trình đơn mà tất cả các cung đều có cùng hướng, tức là mỗi đỉnh trong chu trình đều có bậc trong và bậc ngoài bằng 1 Trong ngữ cảnh rõ ràng, chu trình này có thể được gọi đơn giản là chu trình.

- Chu trình đơn: là chu trình không đi qua một cạnh nào quá một lần.

Chu trình sơ cấp là chu trình không lặp lại đỉnh nào ngoài đỉnh đầu và đỉnh cuối Ví dụ, trong đồ thị, chu trình (1, 5, 2, 1) là một chu trình sơ cấp Đồng thời, chu trình sơ cấp cũng được coi là chu trình đơn.

- Chu trình Euler: là chu trình qua tất cả các cạnh, mỗi cạnh đúng một lần.

- Chu trình bao trùm: là cách gọi khác của chu trình Hamilton.

Chu trình chẵn là chu trình có độ dài là một số nguyên chẵn, ví dụ như chu trình với 4 đỉnh và 4 cạnh, được biểu diễn là A–B–C–D–A.

Hình 12: Chu trình chẵn Đặc điểm:

- Là một đường đi khép kín bắt đầu và kết thúc tại cùng một đỉnh.

- Không lặp lại đỉnh nào ở giữa (nếu là chu trình đơn).

- Số lượng đỉnh và số lượng cạnh là chẵn.

Đồ thị hai phía (bipartite graph) có đặc điểm là có thể chia các đỉnh trong chu trình thành hai tập rời, sao cho mỗi cạnh chỉ nối một đỉnh từ tập này với một đỉnh từ tập kia.

- Nếu một đồ thị không chứa chu trình lẻ, thì nó là đồ thị hai phía.

Chu trình lẻ là một chu trình khép kín trong đồ thị, đặc trưng bởi độ dài lẻ, tức là nó đi qua một số lượng cạnh lẻ và quay trở lại điểm xuất phát.

Ví dụ: Chu trình 3 cạnh (tam giác): A–B–C–A, gồm 3 đỉnh và 3 cạnh.

Hình 13: Chu trình lẻ Đặc điểm:

- Bắt đầu và kết thúc tại cùng một đỉnh.

- Không lặp lại đỉnh nào ở giữa (nếu là chu trình đơn).

Một đồ thị chứa chu trình lẻ không thể được chia thành hai tập độc lập, trong đó mọi cạnh nối giữa hai tập này Do đó, đồ thị này không thể là đồ thị hai phía (bipartite graph).

- Thường là dấu hiệu của sự phức tạp hoặc bất đối xứng trong cấu trúc của đồ thị.

Chu trình có hướng là một chu trình đơn, trong đó tất cả các cạnh đều là cung có hướng Các hướng của các cung này tạo thành một vòng khép kín theo một chiều duy nhất.

Hình 14: Chu trình có hướng Đặc điểm:

- Là một chu trình đơn: không lặp lại đỉnh nào (trừ đỉnh đầu và cuối trùng nhau).

- Mỗi đỉnh trong chu trình có:

Bậc vào (indegree) = 1: có đúng một cung đi vào.

Bậc ra (outdegree) = 1: có đúng một cung đi ra.

Tất cả các cung trong chu trình đều cùng hướng, cho phép bạn bắt đầu từ bất kỳ đỉnh nào, di chuyển theo chiều của các cung và quay trở lại điểm xuất phát mà không cần phải đi ngược hướng.

Chu trình đơn là một chu trình trong đồ thị, trong đó không có cạnh nào được đi qua quá một lần Thông thường, chu trình này cũng không đi qua bất kỳ đỉnh nào quá một lần, ngoại trừ đỉnh đầu và cuối, vì chúng trùng nhau.

Lưu ý rằng trong một số tài liệu, thuật ngữ "chu trình đơn" có thể được sử dụng thay cho "chu trình sơ cấp" (không lặp đỉnh giữa) Tuy nhiên, định nghĩa chuẩn của chu trình đơn là không lặp cạnh, cho phép lặp đỉnh miễn là không trùng cạnh.

Hình 15: Chu trình đơn Đặc điểm:

- Là đường đi đóng (khép kín), bắt đầu và kết thúc tại cùng một đỉnh.

- Không đi qua bất kỳ cạnh nào quá một lần.

Chu trình sơ cấp là một loại chu trình trong đồ thị, trong đó không có đỉnh nào xuất hiện nhiều hơn một lần, ngoại trừ đỉnh đầu tiên, cũng là đỉnh cuối cùng, tạo thành một đường đi khép kín.

Ví dụ: Chu trình (1, 5, 2, 1) là một chu trình sơ cấp, vì 1 → 5 → 2 → quay lại 1, và không có đỉnh nào lặp lại ở giữa. Đặc điểm:

- Là chu trình đơn: không đi qua cùng một cạnh hai lần.

- Không đi qua cùng một đỉnh hai lần, ngoại trừ đỉnh đầu/đỉnh cuối.

Chu trình sơ cấp là chu trình đơn, nhưng không phải mọi chu trình đơn đều là chu trình sơ cấp, vì chu trình đơn có thể lặp lại đỉnh mà không lặp lại cạnh.

- Chu trình sơ cấp là đơn giản nhất và sạch nhất về cấu trúc: không vòng lặp, không rẽ nhánh, không quay lại giữa chừng.

Chu trình Euler là một chu trình khép kín trong đồ thị, có thể là vô hướng hoặc có hướng, đi qua mỗi cạnh đúng một lần và bắt đầu cũng như kết thúc tại cùng một đỉnh.

Hình 16: Chu trình Euler Đặc điểm:

- Với đồ thị vô hướng chu trình Euler tồn tại nếu và chỉ nếu: Đồ thị là liên thông, và

Mọi đỉnh đều có bậc chẵn (số cạnh nối đến đỉnh là số chẵn).

- Với đồ thị có hướng chu trình Euler tồn tại nếu và chỉ nếu: Đồ thị là liên thông yếu, và

Với mọi đỉnh, bậc vào = bậc ra.

Có thể lặp lại đỉnh (nhiều lần), miễn là không lặp lại cạnh.

Là một chu trình đơn theo nghĩa "không lặp cạnh", nhưng không phải chu trình sơ cấp, vì có thể quay lại đỉnh nhiều lần.

1.5.7 Chu trình bao trùm (Chu trình Hamilton)

Chu trình bao trùm (chu trình Hamilton) là một chu trình trong đồ thị mà:

- Đi qua mỗi đỉnh đúng một lần, và

- Bắt đầu và kết thúc tại cùng một đỉnh.

Khác với chu trình Euler (đi qua tất cả cạnh), chu trình Hamilton tập trung vào việc đi qua tất cả đỉnh đúng một lần.

Hình 17: Chu trình Hamilton Đặc điểm:

- Là một chu trình đơn: không lặp lại đỉnh (ngoại trừ đỉnh đầu cũng là đỉnh cuối).

- Không yêu cầu phải đi qua tất cả các cạnh, chỉ cần mỗi đỉnh xuất hiện một lần.

- Không có điều kiện đơn giản như chu trình Euler để xác định sự tồn tại – xác định một chu trình Hamilton là một bài toán NP-khó.

Một số định lý hỗ trợ:

- Định lý Dirac: Nếu đồ thị đơn có n ≥ 3 đỉnh và mỗi đỉnh đều có bậc ≥ n/2, thì đồ thị đó có chu trình Hamilton.

- Định lý Ore: Nếu với mọi cặp đỉnh không kề nhau u,vu, vu,v, ta có deg(u)+deg(v) ≥ n, thì đồ thị có chu trình Hamilton.

CHU TRÌNH EULER

Định nghĩa

Trong lý thuyết đồ thị, đường đi Euler trong đồ thị G = (X, E) là đường đi đi qua mỗi cạnh của đồ thị một lần duy nhất Nếu đường đi Euler có đỉnh cuối cùng trùng với đỉnh xuất phát, nó được gọi là chu trình Euler.

Một đồ thị có chu trình Euler được gọi là đồ thị Euler Một đồ thị có đường đi Euler

Trong các đồ thị trên, đồ thị G1 có chu trình Euler là (a,e,c,d,e,b,a); (a,e,c,d,e,b,a)

Đồ thị G2 không có chu trình Euler nhưng có đường đi Euler là (a,c,d,e,b,a,d,b), do đó nó được coi là đồ thị nửa Euler Ngược lại, đồ thị G3 không có cả chu trình Euler lẫn đường đi Euler.

Định lý

Một đồ thị vô hướng, liên thông G=(V,E) có chu trình Euler khi và chỉ khi mọi đỉnh của nó đều có bậc chẵn: deg(v)≡0 (mod 2); v V.∀ ∈

Nếu đồ thị G có chu trình Euler, thì mỗi khi đi qua một đỉnh trong chu trình, bậc của đỉnh đó sẽ tăng thêm 2 do có hai cạnh liên thuộc Vì chu trình Euler đi qua tất cả các cạnh, nên mọi đỉnh của đồ thị đều có bậc chẵn Ngược lại, nếu G liên thông và tất cả các đỉnh đều có bậc chẵn, ta có thể xây dựng thuật toán để tìm chu trình Euler trên đồ thị.

Hệ quả 1: Một đồ thị vô hướng liên thông G=(V, E) có đường đi Euler khi và chỉ khi nó có đúng 2 đỉnh bậc lẻ.

Nếu đồ thị G có đường đi Euler, thì chỉ có hai đỉnh là đỉnh bắt đầu và đỉnh kết thúc có bậc lẻ, trong khi tất cả các đỉnh khác đều có bậc chẵn Ngược lại, nếu đồ thị liên thông có đúng hai đỉnh bậc lẻ, ta có thể thêm một cạnh giả nối hai đỉnh này, sau đó tìm chu trình Euler Cuối cùng, loại bỏ cạnh giả sẽ cho ra đường đi Euler.

Một đồ thị có hướng liên thông yếu G=(V,E) có chu trình Euler nếu và chỉ nếu mọi đỉnh của nó có bán bậc ra bằng bán bậc vào, tức là deg+(v) = deg−(v) với mọi đỉnh v thuộc V Ngược lại, nếu G liên thông yếu và mọi đỉnh có bán bậc ra bằng bán bậc vào, thì G sẽ có chu trình Euler, đồng nghĩa với việc G là đồ thị liên thông mạnh.

Chứng minh: Tương tự cách chứng minh định lý 1.

Một đồ thị có hướng liên thông yếu \( G=(V,E) \) có đường đi Euler nhưng không có chu trình Euler nếu và chỉ nếu tồn tại đúng hai đỉnh \( s, t \in V \), sao cho tất cả các đỉnh còn lại của đồ thị đều có bậc ra bằng bậc vào.

Chứng minh định lý số 11 sẽ cho phép chúng ta phát triển một thuật toán hiệu quả để tìm chu trình Euler trên đồ thị Euler, cụ thể là giải thuật Fleury.

Điều kiện có chu trình Euler

Đối với đồ thị vô hướng

Các đỉnh có bậc khác 0 của đồ thị phải liên thông với nhau

Tất cả các đỉnh của đồ thị đều có bậc chẵn Đối với đồ thị có hướng

Các đỉnh có bậc khác 0 của đồ thị thuộc cùng một thành phần liên thông

Mọi đỉnh thuộc đồ thị phải có bán bậc ra và bán bậc vào bằng nhau.

Hình 19: Chu trình Euler và điều kiện liên thông

Thuật toán tìm chu trình Euler

Ngày nay, có hai thuật toán phổ biến để tìm chu trình Euler: Thuật toán Fleury và thuật toán Heirholzer.

Thuật toán Fleury: Thuật toán tìm đường đi hay chu trình Euler Thuật toán này đơn giản và hữu ích khi đồ thị có nhiều nhất 2 đỉnh bậc lẻ.

+ Bước 1: Kiểm tra đồ thị có phải là chu trình Euler không

+ Bước 2: Chọn đỉnh bắt đầu

Bước 3: Chọn một cạnh để đi qua và xóa cạnh đó khỏi đồ thị Tiếp tục chọn cạnh tiếp theo, đồng thời thêm những cạnh đã đi qua vào đường dẫn Quá trình này lặp lại cho đến khi không còn cạnh nào để đi qua trên đồ thị.

Nhược điểm: Việc chọn đỉnh bắt đầu và thực hiện tốn nhiều thời gian.

Thuật toán Heirholzer: Phương pháp hiệu quả hơn thuật toán Fleury trong việc tìm ra chu trình Euler

+ Bước 1: Chọn một đỉnh bắt đầu là đỉnh có bậc lớn không 0, gọi là u.

+ Bước 2: Từ đỉnh bắt đầu, tìm chu trình con chứa đỉnh u như sau: Khởi tạo mảng

Bắt đầu từ đỉnh, chọn một cạnh để di chuyển và lưu lại cạnh đó vào mảng rỗng C Tiếp tục lặp lại quá trình này cho đến khi không thể di chuyển thêm, lúc này ta sẽ tìm được chu trình con C.

Bước 3: Nếu đã đi qua tất cả các đỉnh và tìm được chu trình con C, nhưng vẫn còn đỉnh chưa được thăm, các cạnh chưa đi qua sẽ tạo thành một phần liên thông yếu Liên thông yếu là khái niệm chỉ ra rằng có ít nhất một đỉnh trong chu trình C mà vẫn còn cạnh chưa được khám phá.

+ Bước 4: Tiếp tục như bước 2 để tìm chu trình con D chứa v Sau khi hoàn thành, ta tìm được chu trình con D chứa các cạnh còn lại của đồ thị.

+ Bước 5: Nối 2 chu trình con C và D lại tại đỉnh chung v Lặp lại bước 2.

Ứng dụng chu trình Euler vào bài toán thực tế

Xe giao hàng phải đi qua tất cả các con đường trong khu dân cư một lần duy nhất và trở về điểm xuất phát Mô hình khu dân cư được thể hiện qua đồ thị.

 Các cạnh: AB, BC, CD, DA, AC, BD

 Bậc mỗi đỉnh: o A: 3 cạnh (AB, DA, AC) → bậc lẻ o B: 3 cạnh (AB, BC, BD) → bậc lẻ o C: 3 cạnh (BC, CD, AC) → bậc lẻ o D: 3 cạnh (CD, DA, BD) → bậc lẻ

Tất cả đỉnh đều có bậc lẻ → Không tồn tại chu trình Euler

CHU TRÌNH HAMILTON

Định nghĩa

Chu trình Hamilton là một đường đi qua tất cả các đỉnh của đồ thị, với mỗi đỉnh chỉ được đi qua một lần và quay về đỉnh xuất phát Trong khi đó, đường đi Hamilton là đường đi qua tất cả các đỉnh mà không quay về đỉnh xuất phát, với mỗi đỉnh cũng chỉ được đi qua một lần.

Một đồ thị có chu trình Hamilton thì tất nhiên đồ thị đó cũng có đường đi Hamilton nhưng điều ngược lại thì không đúng.

Trong bài viết này, chúng ta xem xét chu trình Hamilton trong các đồ thị khác nhau Đồ thị G1 có chu trình Hamilton là: a-b-c-d-e-a, trong khi đồ thị G2 chỉ có đường đi Hamilton là: a-b-c-d Đặc biệt, đồ thị G3 không có chu trình lẫn đường đi Hamilton.

Điều kiện

Xét đơn đồ thị vô hướng G = (V,E ) có n đỉnh (n ≥ 3) Nếu mọi đỉnh đều có bậc không nhỏ hơn n/2 thì G là đồ thị Hamilton.

G là đơn đồ thị liên thông có 6 đỉnh Mọi đỉnh của G đều có bậc 4 > 6/2 =3.

Theo định lý Dirak, G có chu trình Hamilton.

Ta có A-B-C-E-F-D-A là một chu trình Hamilton của G.

Hình 21: Định lý Dirak Định lý Ore (1960):

Đồ thị vô hướng G = (V,E) với n đỉnh (n ≥ 3) được xem xét Nếu trong mọi cặp đỉnh không kề nhau, không có cặp nào có tổng bậc nhỏ hơn n, thì G được xác định là đồ thị Hamilton.

G là đơn đồ thị liên thông có 5 đỉnh G chỉ có hai cặp đỉnh không kề nhau là A,D và E,D Ta có d(A) + d(D)= d(E) + d(D)= 3 + 2 = 5 Theo định lý Ore, G có chu trình Hamilton.

Ta có: A-B-D-C-E-A là một chu trình Hamilton của G.

Thuật toán quay lui (Backtracking) tìm chu trình Hamilton

+ Input: đồ thị G(V, E), trong đó V là tập hợp các đỉnh và E là tập hợp các cung.

+ Ouput: Viết thuật toán quay lui (Backtracking) (nếu có).

1.Cho trước đồ thị G(V, E) và bắt đầu từ đỉnh bất kì v.

Để thực hiện thuật toán, ta tuần tự thăm các đỉnh liền kề bằng cách chọn lần lượt một cung (u, v) trong tập E Khi đến đỉnh v, cần kiểm tra xem v có thể thuộc chu trình Hamilton hay không Nếu v có thể thuộc chu trình, thuật toán sẽ hoàn thành.

4.Nếu không, thì đổi hướng đến đỉnh u, ghi nhớ các đỉnh đã thăm (xử lý quá trình quay lui).

Lặp lại bước 2 cho đến khi phát hiện chu trình Hamilton hoặc không còn đỉnh nào để thăm Nếu thuật toán kết thúc mà không tìm thấy chu trình Hamilton, điều đó có nghĩa là chu trình không tồn tại Ngược lại, nếu chu trình Hamilton được tìm thấy, thì chu trình này tồn tại.

Ứng dụng chu trình Hamilton vào bài toán thực tế

Công ty A đang đối mặt với bài toán phân phát hàng hóa trong thành phố, với 5 điểm giao hàng bao gồm trụ sở và 4 địa chỉ khách hàng Mục tiêu là tìm ra lộ trình tối ưu để giao hàng đến tất cả các địa điểm và trở về trụ sở mà không đi qua bất kỳ địa điểm nào hai lần.

Hình 23: Đồ thị mô phỏng đường đi của công ty A

Mục tiêu của bài toán là tìm một chu trình Hamilton, tức là lộ trình đi qua tất cả các điểm giao hàng một lần và quay lại điểm xuất phát (trụ sở A) Công thức này có thể áp dụng thông qua các thuật toán brute force, thử tất cả các lộ trình có thể, hoặc các thuật toán heuristic để tìm kiếm giải pháp gần đúng Để đơn giản, chúng ta sẽ sử dụng phương pháp brute force để kiểm tra tất cả các lộ trình.

Bước 1 : Mô phỏng bài toán dưới dạng đồ thị

Bài toán này có thể được mô phỏng bằng đồ thị, trong đó các đỉnh biểu thị cho các điểm giao hàng như trụ sở hoặc khách hàng, và các cạnh thể hiện lộ trình kết nối giữa các điểm này.

Giả sử ta có một bảng chi phí (thời gian, quãng đường) giữa các điểm như sau:

Bước 2 : Tìm chu trình Hamilton

Bảng 1: Bảng biểu diễn dưới dạng cột

Các chu trình có thể có:

Các chu trình có thể bao gồm tất cả các đỉnh (A, B, C, D, E), và mục tiêu là tìm chu trình có tổng chi phí thấp nhất.

Bước 3: Tính tổng chi phí cho từng chu trình

Ta sẽ tính tổng chi phí của từng chu trình Ví dụ:

Các chu trình khác sẽ được tính tương tự.

Bước 4 So sánh và chọn chu trình tối ưu

Sau khi tính toán tổng chi phí cho tất cả các chu trình, chúng ta tiến hành so sánh các tổng chi phí để xác định chu trình có chi phí thấp nhất.

Các chu trình có thể có và tổng chi phí:

Chu trình có chi phí thấp nhất là A → B → C → D → E → A hoặc A → B → C →

E → D → A, với tổng chi phí là 95.

Sử dụng thuật toán khác :

Khi số lượng điểm trong bài toán tăng cao, việc áp dụng các thuật toán xấp xỉ như Thuật toán Nearest Neighbor hoặc Thuật toán Di truyền sẽ giúp giảm thiểu thời gian tính toán Những thuật toán này cho phép tìm ra lộ trình gần tối ưu mà không cần phải thử nghiệm tất cả các chu trình.

Tóm tắt cách sử dụng ma trận :

Ma trận khoảng cách: Mô phỏng các chi phí giữa các điểm.

Thuật toán brute force: Thử tất cả các chu trình và tính toán tổng chi phí.

Chọn chu trình tối ưu: So sánh tổng chi phí để chọn chu trình có chi phí thấp nhất.

Sơ đồ khối giải quyết bài toán chu trình Hamilton

Bắt đầu từ điểm xuất phát (ví dụ, điểm A)

Chọn điểm chưa được thăm gần nhất

Kiểm tra điều kiện hoàn thành

Thêm điểm vào chu trình

ỨNG DỤNG LẬP TRÌNH PYTHON

Code

import heapq from collections import defaultdict

 heapq: Thư viện hỗ trợ cấu trúc dữ liệu hàng đợi ưu tiên (priority queue), dùng trong thuật toán

Dijkstra để tìm đường đi ngắn nhất.

 defaultdict: Từ điển với giá trị mặc định, giúp xử lý các key chưa tồn tại mà không gây lỗi. class GiaoHang:

This class manages the delivery problem using algorithms for optimal pathfinding It initializes with an adjacency matrix and the number of vertices, storing the adjacency matrix to represent the graph and the number of delivery points A default dictionary is used to create an adjacency list, which is populated by iterating through the matrix to identify existing paths The function converts the adjacency matrix into an adjacency list for easier processing.

 ma_tran: Ma trận vuông, trong đó ma_tran[i][j] > 0 nếu có đường đi từ i đến j.

 danh_sach_ke: Lưu các đỉnh kề của mỗi đỉnh. def tim_chu_trinh_euler(self):

# Hàm kiểm tra đỉnh bậc lẻ def bac_le(): return [v for v in range(self.so_dinh) if len(self.danh_sach_ke[v]) % 2 != 0]

# Hàm kiểm tra tính liên thông bằng DFS def lien_thong(): da_tham = [False] * self.so_dinh

2 def dfs(v): da_tham[v] = True for ke in self.danh_sach_ke[v]: if not da_tham[ke]: dfs(ke)

# Bắt đầu DFS từ đỉnh đầu tiên có cạnh for i in range(self.so_dinh): if len(self.danh_sach_ke[i]) > 0: dfs(i) break

# Kiểm tra tất cả đỉnh có cạnh đều được thăm return all(da_tham[i] or len(self.danh_sach_ke[i]) == 0 for i in range(self.so_dinh))

# Nếu không thỏa điều kiện → không có chu trình Euler if not lien_thong() or len(bac_le()) > 0: return None

# Tạo bản sao đồ thị để thao tác do_thi_temp = defaultdict(list, {k: v[:] for k, v in self.danh_sach_ke.items()}) chu_trinh = [] stack = [0] # Bắt đầu từ đỉnh 0

The Hierholzer algorithm utilizes a stack to find an Eulerian circuit in a graph It begins by checking if there are any remaining edges from the current vertex If edges are available, it pops an adjacent vertex from the temporary graph, removes the reverse edge, and pushes the new vertex onto the stack When no edges are left, it pops vertices from the stack to form the cycle Finally, the algorithm returns the cycle in the correct order by reversing the collected vertices.

 bac_le(): Trả về danh sách các đỉnh có bậc lẻ.

 lien_thong(): Kiểm tra đồ thị liên thông bằng DFS.

- Bắt đầu từ một đỉnh, đi theo các cạnh đến khi không thể đi tiếp.

- Quay lại và thêm các chu trình con vào chu trình chính. def tim_chu_trinh_hamilton(self): duong_di = []

The recursive backtracking function `hamilton_hien_tai` checks for Hamiltonian paths in a graph It verifies if all vertices have been visited by comparing the length of the current path to the total number of vertices The function also checks for an edge from the last visited vertex back to the starting vertex It iterates through the adjacent vertices, marking them as visited, and recursively calls itself to explore further paths If a valid Hamiltonian path is found, it returns true.

# Quay lui nếu không tìm thấy duong_di.pop() da_tham[ke] = False return False

The algorithm tests each vertex as a starting point It initializes the path with the starting vertex and marks it as visited If the current Hamiltonian path is valid, it returns the completed cycle by adding the starting vertex to the end of the path If no valid path is found, it returns None.

- Thử từng đỉnh kề, đánh dấu đã thăm.

- Nếu không tìm được đường, quay lui và thử đỉnh khác.

 Nếu tìm thấy đường đi qua tất cả đỉnh và quay về điểm xuất phát → trả về chu trình. def tim_duong_ngan_nhat(self, diem_bat_dau):

# Khởi tạo khoảng cách ban đầu là vô cùng khoang_cach = {i: float('inf') for i in range(self.so_dinh)} khoang_cach[diem_bat_dau] = 0 # Khoảng cách đến chính nó = 0

# Hàng đợi ưu tiên (min-heap) hang_doi = [(0, diem_bat_dau)] duong_di = {} # Lưu vết đường đi while hang_doi:

_, dinh_hien_tai = heapq.heappop(hang_doi)

The algorithm iterates through adjacent vertices, checking for existing paths If a path exists, it calculates a new distance by adding one to the current distance If this new distance is shorter than the previously recorded distance, it updates the distance and records the path Finally, it adds the new distance and vertex to the priority queue for further processing, ultimately returning the path taken.

 BFS tìm đường đi ngắn nhất (số cạnh ít nhất).

Hàm `heapq.heappop()` và `heapq.heappush()` được sử dụng để ưu tiên đỉnh có khoảng cách nhỏ nhất trong thuật toán tìm đường Hàm `in_duong_ngan_nhat(self, diem_bat_dau)` sẽ trả về đường đi ngắn nhất từ điểm bắt đầu đã cho.

# Tìm đỉnh xa nhất để quay về diem_quay_ve = max(duong_di.keys(), key=lambda x: duong_di.get(x, -1))

Để truy vết đường đi hiện tại, ta khởi tạo danh sách `duong_di_hien_tai` và biến `dinh` với giá trị là `diem_quay_ve` Trong khi `dinh` còn nằm trong `duong_di`, ta sẽ thêm `dinh` vào `duong_di_hien_tai` và cập nhật `dinh` bằng giá trị tương ứng trong `duong_di` Cuối cùng, ta thêm `diem_bat_dau` vào danh sách và đảo ngược thứ tự của `duong_di_hien_tai` để có được đường đi từ điểm bắt đầu.

Để hoàn thiện chu trình, hãy thêm điểm xuất phát cuối cùng vào danh sách đường đi hiện tại bằng cách sử dụng lệnh `duong_di_hien_tai.append(diem_bat_dau)` Kết quả sẽ hiển thị đường đi ngắn nhất với cú pháp `print(f"Đường đi ngắn nhất: {' -> '.join(map(str, duong_di_hien_tai))}")`.

 Tìm đỉnh xa nhất (diem_quay_ve).

 Truy vết từ diem_quay_ve về diem_bat_dau.

 In ra đường đi ngắn nhất dạng A → B → C → A.

# Nhập số lượng điểm giao hàng so_dinh = int(input("Nhập số lượng điểm giao hàng: ")) ma_tran = []

# Nhập ma trận kề print("Nhập ma trận kề (dùng 0 nếu không có đường đi):") for i in range(so_dinh): ma_tran.append(list(map(int, input().split())))

# Khởi tạo đối tượng GiaoHang giao_hang = GiaoHang(ma_tran, so_dinh)

Để tìm và in chu trình Euler, sử dụng hàm `giao_hang.tim_chu_trinh_euler()` Nếu có chu trình Euler, in ra kết quả với định dạng "Chu trình Euler: [các đỉnh]" Nếu không có chu trình Euler, thông báo "Không có chu trình Euler."

Để tìm và in chu trình Hamilton, sử dụng hàm `giao_hang.tim_chu_trinh_hamilton()` Nếu có chu trình Hamilton, in ra kết quả dưới dạng "Chu trình Hamilton: [các đỉnh]" Nếu không có chu trình Hamilton, thông báo "Không có chu trình Hamilton."

# Nhập điểm xuất phát và in đường đi ngắn nhất diem_bat_dau = int(input("Nhập điểm xuất phát: ")) giao_hang.in_duong_ngan_nhat(diem_bat_dau)

 Nhập số đỉnh và ma trận kề.

 Tìm và in chu trình Euler, chu trình Hamilton, và đường đi ngắn nhất.

Thuật toán Mục đích Độ phức tạp

Hierholzer Tìm chu trình Euler O(E)

Quay lui (Backtracking) Tìm chu trình Hamilton O(N!)

BFS (Dijkstra đơn giản) Tìm đường đi ngắn nhất O((V+E) log V)

Thuật toán chạy code

Nhập số đỉnh và ma trận kề Đồ thị liên thông?

Không có chu trình Euler

Khởi tạo đồ thị tạm và stack

Dùng stack tìm chu trình Euler

Khởi tạo thử từng đỉnh

Tìm được chu trình Hamilton?

Không có chu trình Hamilton

Khởi tạo dist[], prev[] và heapq

In đường đi ngắn nhất và quay về

Thuật toán Dijkstra

Thuật toán Dijkstra là một phương pháp trong lý thuyết đồ thị, được sử dụng để xác định đường đi ngắn nhất từ một đỉnh nguồn đến tất cả các đỉnh khác trong đồ thị có trọng số không âm.

 Đồ thị có trọng số không âm trên các cạnh.

 Áp dụng được cho đồ thị có hướng hoặc vô hướng.

 Đồ thị có thể liên thông hoặc không liên thông (nếu không liên thông thì thuật toán chỉ tính được đến các đỉnh có thể đi từ đỉnh nguồn).

Thuật toán Dijkstra tìm kiếm đường đi ngắn nhất trong đồ thị bằng cách duyệt qua các đỉnh theo thứ tự khoảng cách từ đỉnh xuất phát Nó mở rộng từ đỉnh hiện tại đến các đỉnh kề có chi phí thấp nhất, đồng thời duy trì bộ đường đi ngắn nhất tới các đỉnh đã được xem xét.

+ Bắt đầu từ đỉnh xuất phát, gán giá trị khoảng cách bằng 0.

+ Gán giá trị khoảng cách cho tất cả các đỉnh còn lại là +∞.

+ Tạo một tập hợp trống để lưu trữ các đỉnh đã được xử lý.

Khởi tạo thuật toán Dijkstra

+ Chọn đỉnh chưa được xử lý có khoảng cách nhỏ nhất (ban đầu là đỉnh xuất phát).

Cập nhật khoảng cách cho các đỉnh kề của đỉnh hiện tại Nếu khoảng cách từ đỉnh hiện tại đến đỉnh kề qua một cạnh nhỏ hơn giá trị khoảng cách đã biết, hãy thực hiện việc cập nhật khoảng cách này.

+ Đánh dấu đỉnh hiện tại là đã xử lý.

Xét từng đỉnh trong đồ thị

- Kết thúc: Quá trình tiếp tục lặp lại cho đến khi tất cả các đỉnh đã được xử lý hoặc khoảng cách đến đích đã được tối ưu.

Hoàn tất xét tất cả các đỉnh và kết thúc

+ Tính toán nhanh và chính xác đường đi ngắn nhất với trọng số không âm. + Có thể áp dụng cho cả đồ thị có hướng và vô hướng.

+ Không dùng được với trọng số âm (dẫn đến kết quả sai).

+ Không tìm được chu trình hay đường đi qua tất cả các đỉnh (đó là bài toán Hamiltonian).

+ Cần lưu cấu trúc dữ liệu bổ trợ như mảng đánh dấu, mảng khoảng cách, hàng đợi ưu tiên.

 Thuật toán Dijsktra thường ứng dụng trong:

+ Giao thông và định vị: Ứng dụng trong Google Maps, GPS để tìm đường đi ngắn nhất, tối ưu hóa lộ trình xe buýt, xe tải giao hàng.

+ Mạng máy tính: Dùng trong giao thức định tuyến như OSPF (Open Shortest Path First).

+ Quản lý mạng điện – nước: Tối ưu hóa đường truyền dẫn điện/nước, giảm tổn thất năng lượng.

+ Trí tuệ nhân tạo và game: Di chuyển nhân vật, tìm đường tránh vật cản.

+ Logistics và quản lý chuỗi cung ứng: Xác định tuyến vận chuyển tiết kiệm chi phí nhất.

Ngày đăng: 02/06/2025, 00:26

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Sách Đại Số Tuyến Tính của tác giả Đặng Văn Vinh (nhà xuất bản ĐHQG TP. Hồ Chí Minh) Sách, tạp chí
Tiêu đề: Sách Đại Số Tuyến Tính
Tác giả: Đặng Văn Vinh
Nhà XB: ĐHQG TP. Hồ Chí Minh
[2] “Toán rời rạc”- Nguyễn Đức Nghĩa, Nguyễn Tô Thành (2008), NXB Giáo dục Sách, tạp chí
Tiêu đề: Toán rời rạc
Tác giả: Nguyễn Đức Nghĩa, Nguyễn Tô Thành
Nhà XB: NXB Giáo dục
Năm: 2008
[3] Định lý Dirak, Ore : “Lý thuyết đồ thị”- Nguyễn Cam, Chu Đức Khánh, Nhà xuất bản trẻ 1998 Sách, tạp chí
Tiêu đề: Lý thuyết đồ thị
Tác giả: Nguyễn Cam, Chu Đức Khánh
Nhà XB: Nhà xuất bản trẻ
Năm: 1998
[4] Những người đóng góp vào các dự án Wikimedia, “Thuật toán Dijkstra,” Aug. 21, 2024. https://vi.wikipedia.org/wiki/Thu%E1%BA%ADt_to%C3%A1n_Dijkstra Sách, tạp chí
Tiêu đề: Thuật toán Dijkstra
Tác giả: Những người đóng góp vào các dự án Wikimedia
Nhà XB: Wikipedia
Năm: 2024
[5] Trường N. T., “Ma trận kề – Danh sách kề là gì | Cách biểu diễn đồ thị,”TTnguyen, Jan. 18, 2025. https://ttnguyen.net/ma-tran-ke/ Sách, tạp chí
Tiêu đề: Ma trận kề – Danh sách kề là gì | Cách biểu diễn đồ thị
Tác giả: Trường N. T
Nhà XB: TTnguyen
Năm: 2025
[8] LongDT, “Giải thuật và lập trình: §6. Chu trình Euler, đường đi Euler, đồ thị Euler,” V1Study, Nov. 06, 2016. https://v1study.com/giai-thuat-va-lap-trinh-chu-trinh-euler-duong-di-euler-do-thi-euler.html Sách, tạp chí
Tiêu đề: Giải thuật và lập trình: §6. Chu trình Euler, đường đi Euler, đồ thị Euler
Tác giả: LongDT
Nhà XB: V1Study
Năm: 2016
[11] V. Algorithm, “Đồ thị Hamilton và chu trình Hamilton,” Viblo, May 11, 2025.https://viblo.asia/p/do-thi-hamilton-va-chu-trinh-hamilton-Ljy5V393Kra Sách, tạp chí
Tiêu đề: Đồ thị Hamilton và chu trình Hamilton
Tác giả: V. Algorithm
Nhà XB: Viblo
Năm: 2025
[12] Q. C. Trần, Lý thuyết đồ thị và ứng dụng. Available:https://luyenthidanang.wordpress.com/wp-content/uploads/2014/10/chuong-2.pdf[13] “Đường đi - Chu trình Euler,” VNOI Wiki. https://wiki.vnoi.info/algo/graph-theory/euler-cycle.md Sách, tạp chí
Tiêu đề: Lý thuyết đồ thị và ứng dụng
Tác giả: Q. C. Trần
[14] Trường N. T., “Đường đi và chu trình Euler – Lý thuyết và bài tập có lời giải,”TTnguyen, Jan. 18, 2025. https://ttnguyen.net/chu-trinh-euler/#google_vignette Sách, tạp chí
Tiêu đề: Đường đi và chu trình Euler – Lý thuyết và bài tập có lời giải
Tác giả: Trường N. T
Nhà XB: TTnguyen
Năm: 2025

HÌNH ẢNH LIÊN QUAN

1.1. Đồ thị (Graph) - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
1.1. Đồ thị (Graph) (Trang 8)
Hình 2: Đồ thị có hướng - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 2 Đồ thị có hướng (Trang 9)
Hình 3: Đồ thị có trọng số trên các cạnh - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 3 Đồ thị có trọng số trên các cạnh (Trang 10)
1.4. Đồ thị liên thông (Connected Graph) - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
1.4. Đồ thị liên thông (Connected Graph) (Trang 13)
Hình 7: Đồ thị song liên thông - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 7 Đồ thị song liên thông (Trang 15)
Hình 9: Đồ thị liên thông yếu - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 9 Đồ thị liên thông yếu (Trang 16)
Hình 11: Một đồ thị đơn có chu trình - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 11 Một đồ thị đơn có chu trình (Trang 17)
Hình 14: Chu trình có hướng - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 14 Chu trình có hướng (Trang 19)
Hình 16: Chu trình Euler - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 16 Chu trình Euler (Trang 21)
Hình 18: Các đồ thị G 1 , G 2 , G 3 - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 18 Các đồ thị G 1 , G 2 , G 3 (Trang 23)
Hình 19: Chu trình Euler và điều kiện liên thông - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 19 Chu trình Euler và điều kiện liên thông (Trang 25)
Hình 20. Ví dụ chu trình Hamilton, đường đi Hamilton - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 20. Ví dụ chu trình Hamilton, đường đi Hamilton (Trang 27)
Đồ thị G1 có chu trình Hamilton là:   a-b-c-d-e-a. - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
th ị G1 có chu trình Hamilton là:   a-b-c-d-e-a (Trang 27)
Hình 21: Định lý Dirak - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
Hình 21 Định lý Dirak (Trang 28)
Đồ thị liên thông? - [Hcmut] Bài tập lớn Đại số tuyến tính  lý thuyết Đồ thị chu trình Euler, chu trình Hamilton, có code
th ị liên thông? (Trang 38)

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w