TÀI LIỆU HỌC PHẦN: LÝ THUYẾT ĐỒ THỊ

Đơn vị biên soạn: Trường Cao đẳng Kỹ thuật Lý Tự Trọng TP. Hồ Chí Minh


Tổng quan về giáo trình (250-300 từ)

Tài liệu học tập học phần Lý thuyết đồ thị được biên soạn bởi Trường Cao đẳng Kỹ thuật Lý Tự Trọng (trực thuộc UBND Thành phố Hồ Chí Minh), phục vụ công tác giảng dạy và học tập trong chương trình đào tạo khối ngành Công nghệ thông tin và Kỹ thuật máy tính ở bậc Cao đẳng và Đại học. Trong chương trình đào tạo, học phần này giữ vai trò là môn học cơ sở ngành, kết nối giữa khối kiến thức toán rời rạc và các môn học chuyên sâu về cấu trúc dữ liệu, thuật toán và mạng máy tính.

Mục tiêu học tập của giáo trình được thiết kế nhằm trang bị cho người học:

  • Hệ thống định nghĩa, tính chất và các định lý nền tảng của lý thuyết đồ thị vô hướng và có hướng.
  • Các phương pháp mô hình hóa dữ liệu đồ thị trong bộ nhớ máy tính tương ứng với từng điều kiện đồ thị dày hay thưa.
  • Kỹ thuật thiết kế và cài đặt các giải thuật tìm kiếm, duyệt đồ thị, kiểm tra liên thông, xác định chu trình Euler và Hamilton.
  • Năng lực chuyển đổi các bài toán thực tiễn (như bài toán định tuyến, lập lịch thi công, thiết kế mạch in) thành bài toán đồ thị và lập trình giải quyết bằng ngôn ngữ C/C++.

Cấu trúc giáo trình phân bổ thời lượng theo nguyên tắc cân bằng giữa lý thuyết và thực hành (50% lý thuyết, 50% thực hành bài tập và lập trình). Cách tiếp cận nội dung đi từ việc hình thành khái niệm toán học thuần túy, minh họa trực quan bằng hình học, chuyển dịch sang cấu trúc dữ liệu trừu tượng, và kết thúc bằng việc hiện thực hóa thuật toán qua mã nguồn cụ thể kèm theo các bộ dữ liệu kiểm thử (test cases). Điểm đặc sắc của tài liệu là việc tích hợp trực tiếp mã nguồn chương trình toàn văn (DFS.CPP, BFS.CPP, PATHDFS.CPP, Lienthong1.CPP) và các bài toán ứng dụng thực tế có cấu trúc tệp dữ liệu vào/ra chuẩn (MH.DAT, INFOR.INP, dothi.inp).


Nội dung kiến thức cốt lõi (500-600 từ)

Các chương và chủ đề chính

Nội dung giáo trình được cấu trúc theo tiến trình logic chặt chẽ qua các chương học trọng tâm:

  1. Chương 1: Các khái niệm cơ bản của lý thuyết đồ thị (Tuần 1 & 2 - 4 tiết LT, 4 tiết TH):

    • Giới thiệu định nghĩa đơn đồ thị, đa đồ thị, giả đồ thị vô hướng (chứa khuyên) và có hướng (chứa cung lặp).
    • Khái niệm đỉnh kề, cạnh liên thuộc, bậc đỉnh $\text{deg}(v)$, đỉnh cô lập ($\text{deg}=0$), đỉnh treo ($\text{deg}=1$), bán bậc vào $\text{deg}^-(v)$ và bán bậc ra $\text{deg}^+(v)$.
    • Khái niệm đường đi đơn, chu trình đơn, tính liên thông, thành phần liên thông, đỉnh rẽ nhánh (đỉnh khớp) và cạnh cầu; liên thông mạnh và liên thông yếu trong đồ thị có hướng.
    • Các dạng đồ thị đặc biệt: Đồ thị đầy đủ $K_n$ với $\frac{n(n-1)}{2}$ cạnh; Đồ thị hai phía $G=(X \cup Y, E)$; Đồ thị phẳng, định lý Kuratowski liên quan đồ thị con đồng cấu $K_{3,3}$ và $K_5$, công thức Euler $r = m - n + 2$; Bài toán tô màu đồ thị và sắc số.
  2. Chương 2: Biểu diễn đồ thị trên máy vi tính (Tuần 3 - 2 tiết LT, 2 tiết TH):

    • Mô tả và phân tích 4 cấu trúc dữ liệu lưu trữ đồ thị: Ma trận kề (đối xứng đối với đồ thị vô hướng, tiêu tốn $n^2$ đơn vị bộ nhớ), Ma trận trọng số (sử dụng các giá trị $0, +\infty, -\infty$), Ma trận liên thuộc đỉnh - cạnh (kích thước $n \times m$, lưu các giá trị $1, -1, 0$), Danh sách cạnh/cung (tiêu tốn $2m$ bộ nhớ, thích hợp cho đồ thị thưa $m \le 6n$), và Danh sách kề $\text{ke}(v)$.
  3. Chương 3: Thuật toán tìm kiếm trên đồ thị, tìm đường đi và tính liên thông:

    • Thuật toán tìm kiếm theo chiều sâu (DFS) sử dụng đệ quy/ngăn xếp (Stack), độ phức tạp $O(n+m)$.
    • Thuật toán tìm kiếm theo chiều rộng (BFS) sử dụng hàng đợi (Queue), độ phức tạp $O(n+m)$.
    • Ứng dụng DFS/BFS giải quyết bài toán tìm đường đi giữa hai đỉnh thông qua mảng Truoc[] (BFS cho đường đi ngắn nhất theo số cạnh) và xác định số lượng cũng như liệt kê các đỉnh trong từng thành phần liên thông thông qua biến Inconnect và mảng Index[] (hoặc lienthong[]).
  4. Chương 4: Đồ thị Euler và Đồ thị Hamilton (Tuần 6 & 7 - 4 tiết LT, 4 tiết TH):

    • Đồ thị Euler: Khái niệm đường đi/chu trình Euler, điều kiện cần và đủ của Euler (1736), thuật toán mở rộng chu trình và thuật toán Fleury (tránh đi qua cầu).
    • Đồ thị Hamilton: Khái niệm đường đi/chu trình Hamilton, điều kiện đủ Dirac (1952) với đỉnh có bậc $\ge \frac{n}{2}$, tính chất của đồ thị đấu loại (mọi đồ thị đấu loại là nửa Hamilton; đồ thị đấu loại liên thông mạnh là Hamilton).

Kiến thức nền tảng được xây dựng

  • Các định lý cơ bản (Fundamental theories):
    • Định lý bắt tay: Trong đồ thị vô hướng $G=(V,E)$ có $m$ cạnh, tổng bậc các đỉnh bằng hai lần số cạnh: $\sum_{v \in V} \text{deg}(v) = 2m$.
    • Hệ quả số đỉnh bậc lẻ trong đồ thị vô hướng luôn là một số chẵn.
    • Định lý bán bậc đồ thị có hướng: Tổng các bán bậc ra bằng tổng các bán bậc vào và bằng số cung: $\sum \text{deg}^+(v) = \sum \text{deg}^-(v) = m$.
    • Định lý đồ thị hai phía: Đơn đồ thị là đồ thị hai phía khi và chỉ khi không chứa chu trình có độ dài lẻ.
    • Định lý Euler cho đồ thị phẳng liên thông: $r = m - n + 2$ (trong đó $r$ là số miền, $m$ là số cạnh, $n$ là số đỉnh).
    • Định lý đặc trưng đồ thị Euler: Đồ thị vô hướng liên thông là Euler khi và chỉ khi mọi đỉnh có bậc chẵn; là nửa Euler khi và chỉ khi có không quá 2 đỉnh bậc lẻ. Đồ thị có hướng liên thông mạnh là Euler khi và chỉ khi $\text{deg}^+(v) = \text{deg}^-(v), \forall v \in V$.
    • Định lý Dirac (1952): Đơn đồ thị vô hướng $n > 2$ đỉnh có bậc mọi đỉnh $\ge \frac{n}{2}$ là đồ thị Hamilton.
  • Nguyên lý cốt lõi (Core principles):
    • Đánh đổi không gian và thời gian trong biểu diễn đồ thị (Ma trận kề truy xuất $O(1)$ nhưng tốn $O(n^2)$ bộ nhớ; Danh sách cạnh tốn ít bộ nhớ $O(m)$ nhưng truy xuất lân cận mất $O(m)$).
    • Cơ chế duyệt trạng thái qua ngăn xếp (vào sau ra trước - DFS) và hàng đợi (vào trước ra trước - BFS).
    • Nguyên tắc tham lam (Greedy) trong bài toán tô màu đồ thị và nguyên tắc định tuyến tránh cầu trong thuật toán Fleury.
  • Khung cấu trúc thiết yếu (Essential frameworks):
    • Khung biểu diễn ma trận và danh sách trong lập trình cấu trúc C/C++.
    • Khung thuật toán duyệt tổng quát sử dụng mảng đánh dấu chuaxet[] (hoặc daxet[]).

Kỹ năng phát triển

  • Kỹ năng kỹ thuật (Technical skills): Cài đặt thành thạo các thuật toán đồ thị bằng C/C++; thao tác xử lý mảng hai chiều, cấu trúc bản ghi struct, danh sách liên kết; xử lý đọc/ghi luồng dữ liệu tệp văn bản (FILE *, fopen, fprintf, fscanf).
  • Kỹ năng phân tích (Analytical skills): Phân tích và chứng minh các tính chất đồ thị (tính phẳng, sắc số, tính liên thông, chu trình Euler/Hamilton); đánh giá độ phức tạp thuật toán dựa trên số đỉnh $n$ và số cạnh $m$.
  • Năng lực thực hành ứng dụng (Practical competencies): Mô hình hóa và lập trình giải quyết các bài toán kỹ thuật như: kiểm tra tính hợp lệ của ma trận biểu diễn, bài toán phát hiện bế tắc và lập lịch môn học (KT3.CPP), bài toán truyền tin mạng email tối thiểu (INFOR.INP), bài toán định tuyến hai đường truyền an toàn không trùng kênh trên mạng máy tính.

Phương pháp giảng dạy và học tập (300-350 từ)

Giáo trình áp dụng phương pháp sư phạm kết hợp chặt chẽ giữa lý thuyết suy diễn và thực nghiệm lập trình. Quy trình học tập được phân bổ cố định: mỗi khối kiến thức lý thuyết đều có số tiết bài tập và thực hành tương đương đi kèm (tỷ lệ 1:1).

[Khái niệm Toán học / Định lý] 
[Mô hình hóa dữ liệu (Ma trận / Danh sách)]
[Thiết kế thuật toán / Mã giả]
[Cài đặt C/C++ & Kiểm thử trên File I/O]
  • Bài tập lý thuyết và tình huống nghiên cứu (Case studies):

    • Tình huống kinh điển bài toán 7 cây cầu Konigsberg (Euler 1736) mở đầu lý thuyết đồ thị Euler.
    • Bài toán 3 căn hộ và 3 giếng cấp năng lượng (minh họa đồ thị phẳng $K_{3,3}$).
    • Bài toán sắp xếp 6 cuộc họp $A, B, C, D, E, F$ vào các buổi không trùng lặp (ứng dụng bài toán tô màu đồ thị).
    • Tình huống tổ chức mạng lưới lập trình viên gửi email thông tin (INFOR.INP, INFOR.OUT).
  • Bài tập thực hành và lập trình:

    • Viết chương trình kiểm tra tính hợp lệ của ma trận kề đọc từ tệp dothi.inp (kiểm tra đường chéo chính $a[i][i]=0$ và tính đối xứng $a[i][j] = a[j][i]$).
    • Chuyển đổi dữ liệu tương hỗ giữa ma trận kề, ma trận trọng số, ma trận liên thuộc và danh sách cạnh/kề.
    • Lập trình toàn văn các thuật toán duyệt DFS, BFS, tìm đường đi (PATHDFS.CPP), đếm số thành phần liên thông (Lienthong1.CPP với tệp dữ liệu li_thong.inp).
    • Cài đặt bài toán xác định thời gian hoàn thành khóa học và phát hiện bế tắc của $N$ môn học dựa trên quan hệ trước/sau (MH.DAT, TKB.DAT).
  • Phương pháp đánh giá: Kết hợp kiểm tra tự luận giải tích (chứng minh định lý, tính số miền $r$, tính số cạnh $m$, vẽ đồ thị phẳng, tô màu xác định sắc số) và chấm điểm mã nguồn chương trình dựa trên độ chính xác của kết quả xuất ra tệp dữ liệu chuẩn.

  • Hướng dẫn tự học: Sinh viên thực hiện ôn tập các cấu trúc dữ liệu nền tảng (đệ quy, mảng một chiều, mảng hai chiều, struct, file text) qua hệ thống 18 bài tập chuẩn bị đầu khóa; tự chạy tay từng bước (dry-run/trace) thuật toán trên sơ đồ đỉnh-cạnh trước khi biên dịch mã nguồn C/C++.


Điểm nổi bật và cập nhật (250-300 từ)

Tài liệu học phần Lý thuyết đồ thị của Trường Cao đẳng Kỹ thuật Lý Tự Trọng tích hợp các nội dung học thuật từ tài liệu tham khảo tiêu chuẩn: Toán rời rạc (Phần 2: Lý thuyết đồ thị) của nhóm tác giả Nguyễn Đức Nghĩa – Nguyễn Tô Thành (Đại học Bách khoa Hà Nội).

Các điểm cập nhật và liên kết thực tiễn trong giáo trình bao gồm:

  • Ứng dụng công nghệ chế tạo mạch in: Tích hợp lý thuyết đồ thị phẳng và định lý Kuratowski vào bài toán thiết kế đường dẫn trên bo mạch điện tử sao cho các đường dây dẫn không cắt nhau ngoài các nút kết nối.
  • Mô hình hóa bài toán lập lịch và quản lý dự án: Đưa bài toán quản lý tiến độ $N$ môn học có ràng buộc phụ thuộc trước/sau vào thực hành lập trình, yêu cầu sinh viên xây dựng thuật toán phát hiện chu trình (bế tắc) và xác định số công việc cực đại có thể thực hiện đồng thời trong một đơn vị thời gian.
  • Kỹ thuật định tuyến mạng an toàn: Xây dựng bài toán truyền tin an toàn giữa hai nút $s$ và $t$ trên mạng máy tính thông qua hai đường truyền độc lập (không có kênh truyền nào bị dùng chung), tối ưu hóa tổng chi phí đường truyền.
  • Tiêu chuẩn hóa mã nguồn: Toàn bộ thuật toán đều được minh họa bằng mã giả chi tiết và mã nguồn C/C++ hoàn chỉnh, có định dạng đọc/ghi tệp tường minh (.inp, .out, .dat), phù hợp với tiêu chuẩn thực hành lập trình thuật toán hiện đại.

Đối tượng sử dụng giáo trình (200-250 từ)

  • Sinh viên:
    • Sinh viên năm thứ nhất và năm thứ hai theo học các ngành Công nghệ thông tin, Kỹ thuật phần mềm, Truyền thông và Mạng máy tính, Khoa học máy tính tại các trường Cao đẳng và Đại học kỹ thuật.
    • Sinh viên cần tài liệu học tập theo học chế tín chỉ có tích hợp bài tập lập trình thực hành.
  • Kiến thức tiên quyết (Prerequisites):
    • Người học cần nắm vững kiến thức môn Toán rời rạc đại cương (tập hợp, logic mệnh đề, quan hệ).
    • Có kỹ năng lập trình căn bản với ngôn ngữ C hoặc C++: hiểu rõ cơ chế đệ quy, xử lý mảng một chiều và hai chiều, cấu trúc struct, kỹ thuật sử dụng con trỏ và thao tác đọc/ghi tệp văn bản.
  • Giảng viên: Sử dụng làm đề cương bài giảng chi tiết, khung phân bổ tiết dạy (lý thuyết - thực hành) và ngân hàng câu hỏi bài tập giải tích, bài tập lập trình phục vụ đánh giá quá trình và thi kết thúc học phần.
  • Tự học và nghiên cứu: Dành cho người học muốn củng cố nền tảng cấu trúc dữ liệu đồ thị và thuật toán phục vụ lập trình thi đấu hoặc thiết kế hệ thống mạng.

Câu hỏi thường gặp (250-300 từ)

1. Giáo trình này phù hợp với ai?

Giáo trình được biên soạn chuyên biệt cho sinh viên bậc Cao đẳng và Đại học kỹ thuật khối ngành Công nghệ thông tin và Kỹ thuật máy tính, cũng như người học cần tài liệu chuẩn hóa về thuật toán đồ thị gắn liền với mã nguồn C/C++.

2. Cần kiến thức nền nào để học tốt học phần này?

Người học cần hoàn thành khối kiến thức Toán rời rạc cơ bản và Kỹ thuật lập trình C/C++, đặc biệt là kỹ năng xử lý mảng hai chiều, đệ quy, danh sách, ngăn xếp/hàng đợi và thao tác tệp tin (fopen, fscanf, fprintf).

3. Điểm khác biệt của giáo trình này so với các tài liệu toán thuần túy?

Giáo trình không chỉ trình bày các định lý và chứng minh giải tích mà luôn đi kèm thuật giải chi tiết, mã giả, phân tích độ phức tạp tính toán và cung cấp toàn văn chương trình cài đặt C/C++ có thể biên dịch trực tiếp.

4. Làm sao để tự học và cài đặt thuật toán hiệu quả?

Người học nên làm theo trình tự 4 bước: (1) Nắm vững định nghĩa và định lý, (2) Giải các bài tập vẽ hình và tính toán thủ công trên giấy, (3) Lần vết từng bước (dry-run) thuật toán với mảng đánh dấu chuaxet[], (4) Lập trình giải các bài toán thực hành trên file I/O theo định dạng mẫu trong tài liệu.

5. Có tài liệu bổ trợ nào được khuyến nghị kèm theo giáo trình?

Tài liệu tham khảo chính yếu được trích dẫn trong giáo trình là cuốn Toán rời rạc (Phần 2: Lý thuyết đồ thị) của hai tác giả Nguyễn Đức Nghĩa và Nguyễn Tô Thành.


Kết luận (150 từ)

Giáo trình Lý thuyết đồ thị của Trường Cao đẳng Kỹ thuật Lý Tự Trọng cung cấp một hệ thống tri thức hoàn chỉnh từ nền tảng toán học rời rạc đến kỹ thuật lập trình thuật toán trên máy vi tính. Cấu trúc nội dung phân định rõ ràng giữa lý thuyết, cấu trúc dữ liệu lưu trữ, giải thuật duyệt, và các dạng đồ thị chuyên biệt (Euler, Hamilton, đồ thị phẳng, đồ thị hai phía).

Lộ trình học tập đề xuất:

  1. Tiếp cận lý thuyết và định lý tại Chương 1.
  2. Nắm vững kỹ thuật biểu diễn dữ liệu tại Chương 2.
  3. Cài đặt các thuật toán nền tảng DFS/BFS và bài toán liên thông tại Chương 3.
  4. Nghiên cứu các dạng đồ thị đặc thù và thuật toán chuyên sâu tại Chương 4.

Nguồn tài nguyên học tập đi kèm bao gồm hệ thống bài tập lý thuyết giải tích, bộ mã nguồn mẫu C/C++ toàn văn và tài liệu tham khảo chuẩn mực Toán rời rạc (Nguyễn Đức Nghĩa – Nguyễn Tô Thành).