Chương 3: Bài toán xếp lịch thi
3.3. Giải quyết bài toán
3.3.2. Phân tích giải thuật
Như đã nói ở trên chúng ta xây dựng đồ thị G trong đó các đỉnh tương ứng với các môn thi, mỗi cặp đỉnh được nối bằng một cạnh khi và chỉ khi chúng tương ứng với hai môn thi thuộc hai giáo viên khác nhau. Đồ thị sau được mô tả trong trường hợp: một thầy có bốn môn thi (tương ứng với các đỉnh A, B, D, E), một giáo viên có một môn thi (tương ứng với đỉnh C).
Do mỗi giáo viên có số môn thi không vượt quá bốn, nên mỗi đỉnh kề với ít nhất ba đỉnh. Do đó các đỉnh của đồ thị G có bậc không nhỏ hơn 3, nên tổng bậc của hai đỉnh bất kỳ không nhỏ hơn 6. Theo định lý 1 thì đồ thị G có xích Hamilton (gồm các cạnh tô đậm).
Dựa vào xích Hamilton này ta lập được lịch thi theo yêu cầu bài toán, dưới đây là hình minh họa đồ thị G:
Hình 3.2: Minh họa đồ thị G có xích Hamilton (không tồn tại chu trình) Ta thấy rằng trong trường hợp này đồ thị không có chu trình Hamilton vì trong trường hợp này ta thấy tổng bậc của đỉnh A và đỉnh B là 6 chỉ bằng số đỉnh trừ 1 nên chỉ có xích Hamilton.
Ta xét thêm một ví dụ tiếp theo: Một giáo viên có 3 môn thi (đỉnh A, B, C), một giáo viên có 2 môn thi (đỉnh D, E) và một giáo viên có 1 môn thi (đỉnh F) và một giáo viên có 1 môn thi (đỉnh G).
G A
B
F
E
D C
E A
D C
B
G
Hình 3.3: Minh họa đồ thị G có chu trình Hamilton
Ta thấy trên đồ thị nút có bậc tối thiểu là bậc 4 nên tổng bậc hai đỉnh bất kỳ không nhỏ hơn 8 lớn hơn số nút của đồ thị nên theo định lý 1 thì đồ thị có chu trình Hamilton.
Giả sử ta cho mỗi môn là một nút trong đồ thị, mỗi nút là một cấu trúc kiểu struct gồm các trường:
- Trường họ tên chứa tên giáo viên giảng dạy.
- Trường môn học chứa tên môn học.
- Trường màu chứa màu để hỗ trợ vẽ đồ thị và chu trình.
Tiếp theo ta khai báo một mảng cấu trúc gồm bảy phần tử mỗi phần tử của mảng đại diện cho một môn học chứa ba trường và có cùng kiểu với mảng cấu trúc trên, mảng này được sử dụng để chứa đựng các môn học theo thứ tự lịch thi và các thành phần của nó (các phần tử có được là do thao tác chèn các phần tử từ mảng cấu trúc được nhập ban đầu).
Ví dụ: Ta nhập mảng các môn học theo thứ tự họ tên giáo viên và số môn học như sau:
STT Giáo viên Môn
1 Nguyễn Văn Nhân Toán
2 Đào Thu Huệ Anh Văn
3 Nguyễn Văn Nhân Lý
4 Tô Thanh Diệu Địa
5 Nguyễn Văn Nhân Hóa
6 Tô Thanh Diệu Sử
7 Nguyễn Văn Nhân Sinh
Thì ta được mảng với tên môn như sau:
Toán Anh Văn Lý Địa Hóa Sử Sinh
Minh họa mảng cấu trúc
Sau khi tổ chức thành mảng cấu trúc ta tiến hành sắp xếp lại mảng theo giáo viên giảng dạy với các môn có cùng giáo viên dạy đứng gần với nhau trong mảng. Sau đó ta mới tiến hành xếp lịch thi.
Để thực hiện điều này ta tiến hành theo hai bước sau:
Bước 1: Gom nhóm các môn của cùng một giáo viên giảng dạy lại với nhau để tiện cho việc sắp xếp sau này.
Sau khi thực hiện thao tác này ta có hình ảnh của mảng như hình minh họa dưới đây:
Toán Lý Hóa Sinh Anh Văn Sử Địa
Nguyễn Văn Nhân Đào Thu Huệ Tô Thanh Diệu
Minh họa bước 1
Nguyễn Văn Nhân Đào Thu Huệ Tô Thanh Diệu
Bước 2: Sau khi được mảng như trên ta tiến hành xếp lịch thi theo cách chèn xen kẽ lớn bé tức là chèn xen kẽ giữa các môn của giáo viên dạy nhiều môn nhất với các môn của giáo viên dạy ít môn nhất, bằng cách lấy các phần tử của mảng đã có chèn vào mảng cấu trúc mới (mảng cấu trúc mới có kiểu giống mảng ban đầu) theo nguyên tắc chèn xen kẽ lớn bé với số lượng môn học của từng giáo viên. Sau khi thực hiện thao tác này ta được mảng sau:
Mảng ban đầu
Toán Lý Hóa Sinh Anh Văn Sử Địa
Toán Anh Văn Lý Địa Hóa Sử Sinh
Mảng mới đã được xếp lịch
Minh họa bước 2 Ta phân tích bước 2 như sau:
Ta chèn từng phần tử của mảng đầu tiên vào mảng mới (gọi là mảng lịch thi).
Ta thấy giáo viên Nguyễn Văn Nhân giảng dạy 4 môn thi và cũng là giáo viên dạy nhiều môn nhất. Ta lấy một trong 4 môn của giáo viên Nguyễn Văn Nhân chèn vào mảng lịch thi trong trường hợp này là môn học đầu tiên trong 4 môn tức là môn Toán được chèn vào mảng lịch thi.
Mảng ban đầu
Toán Lý Hóa Sinh Anh Văn Sử Địa
Toán
Mảng lịch thi
Minh họa thao tác chèn lớn
Tiếp theo ta xóa môn Sinh trong mảng ban đầu và chèn môn học của giáo viên dạy ít môn học nhất. Trong ví dụ này là giáo viên Đào Thu Huệ và môn học được chèn vào mảng lịch thi là môn Anh Văn.
Mảng ban đầu
Toán Lý Hóa Sinh Anh Văn Sử Địa
Toán Anh Văn
Mảng lịch thi
Minh họa thao tác chèn bé
Cứ tiếp tục như thế chèn môn học của giáo viên dạy nhiều môn nhất đến môn học của giáo viên dạy ít môn nhất. Nếu có hai giáo viên có số môn học giảng dạy là bằng nhau và đồng thời là giáo viên có số môn ít nhất hoặc bé nhất trong trường hợp đang xét thì ta chọn môn học có giáo viên giảng dạy không trùng với môn có giáo viên giảng dạy liền trước vị trí sắp chèn và cuối cùng ta được hình ảnh mảng cấu trúc như sau:
Mảng ban đầu
Toán Lý Hóa Sinh Anh Văn Sử Địa
Mảng cấu trúc
Minh họa thao tác chèn cuối cùng
Nếu lấy thứ tự của mảng là thứ tự ngày thi thì ta được bảng lịch thi sau:
Minh họa lịch thi
Sau khi thực hiện các bước trên thì ta đã cơ bản giải quyết được bài toán thỏa mãn yêu cầu.