Th«ng thêng, trong qu¸ tr×nh duyÖt c¸c miÒn liªn th«ng, ta muèn ghi nhËn l¹i mçi phÇn tö lµ thuéc miÒn nµo.[r]
(1)chơng ii bài toán lan
Bi tốn lan tốn có nhiều ứng dụng việc giải số đề thi học sinh giỏi Tin học Nó thờng đợc mơ tả dới mơ hình lý thuyết đồ thị với nhiều tên gọi khác nhau: bài tốn tìm kiếm, tốn duyệt, tốn thăm, Ta mơ toán nh sau:
Xét tập hợp phần tử đấy, định nghĩa quan hệ 2-ngôi phần tử gọi quan hệ kề: phần tử B kề với phần tử A Dới mơ hình đồ thị, phần tử đợc gọi nút hay đỉnh, đỉnh B kề với đỉnh A ta nói có cạnh từ A đến B Quan hệ kề đối xứng hay khơng đối xứng Nếu quan hệ đối xứng cạnh xác định tơng ứng vô hớng (nghĩa cạnh từ A đến B cạnh từ B đến A), trái lại, cạnh có hớng Quan hệ kề đợc mở rộng theo luật
b¾c cầu thành quan hệ lan:
- mi phn t A xem nh lan đợc tới nó, - B kề với A A lan đợc tới B,
- A lan đợc tới B, đồng thời B lan đợc tới C A lan đợc tới C
Trong lý thuyết đồ thị, ngời ta thờng nói A lan đợc tới B từ A có đờng đi tới B, hay từ A đi thăm B Bài toán đặt xác định tập hợp tất phần tử lan đợc từ phần tử xuất phát cho
Có hai phơng pháp lan chủ yếu: lan theo chiều rộng lan theo chiều sâu 1 Lan theo chiều réng
T tởng phơng pháp từ phần tử đợc lan, ta lan dần sang phần tử khác theo mức kề với phần tử xét Có hai thao tác đợc lặp lại trình lan: lấy phần tử từ tập hợp phần tử đợc lan làm điểm xuất phát kết nạp phần tử kề với phần tử vào tập hợp phần tử đợc lan Dĩ nhiên, để vòng lặp kết thúc đợc, phần tử đợc lấy phải loại khỏi tập hợp xét phần tử thêm vào phải phần tử cha đợc kết nạp lần Quá trình lan kết thúc tập hợp phần tử đợc lan xét rỗng ấy, phần tử đợc xét kết nạp phần tử đợc lan từ phần tử ban đầu
Về mặt liệu, tập hợp phần tử đợc lan đợc tổ chức nh hàng đợi, có hai thao tác: lấy phần tử đầu hàng đợi kết nạp phần tử vào cuối hàng đợi Thuật toán lan theo chiều rộng, phần tử S, mơ tả đoạn ch-ơng trình PASCAL (mơ phỏng) dới đây:
Enter; Init;
Append_To_Queue(S);
While <Hàng đợi khác rỗng> begin
Extract_From_Queue(X);
For <Y cha đợc kết nạp Y kề với X> Append_To_Queue(Y);
end; Result;
trong đó, thủ tục Enter nhập thơng tin quan hệ kề phần tử xuất phát, thủ tục Init
(2)Có thể có nhiều cách tổ chức hàng đợi Đơn giản (khi nhớ cho phép), hàng đợi đợc tổ chức nh mảng Q[1 N] lấy giá trị phần tử, N số phần tử đợc xét Để quản lý hàng đợi này, ta thêm vào biến nguyên first, last để vị trí đầu cuối hàng đợi Nh vậy, số phần tử có hàng đợi đợc xác định last-first+1 Các thao tác hàng đợi lúc là:
- khởi tạo hàng đợi rỗng:
first := 1; last := 0;
- lấy X khỏi hàng đợi:
X := Q[first]; first := first+1;
- kết nạp X vào hàng đợi:
last := last+1; Q[last] := X;
2 Lan theo chiỊu s©u
Khác với lan theo chiều rộng lan theo mức kề (vì phần tử đ ợc lan theo hớng), lan theo chiều sâu lan theo hớng chọn không lan thêm đợc lùi lại lan theo hớng khác Để trình lan kết thúc, tất nhiên không đợc lan lại phần tử lan Thực chất phơng pháp quay lui để duyệt hớng lan có ta dùng thủ tục đệ quy Depth_Expand(X) dới để mô tả việc lan theo chiều sâu từ X (kiểu phần tử đợc định nghĩa tên Elements): Procedure Depth_Expand(X: Elements);
Var Y: Elements; Begin
<đánh dấu lan cho X>;
For <Y cha lan vµ Y kỊ víi X> Depth_Expand(Y); End;
Việc dùng thủ tục đệ quy tổ chức lu trữ thông tin trình lan theo cấu ngăn xếp Bài toán lan S lúc đợc giải theo mơ hình sau:
Enter; Init;
Depth_Expand(S); Result;
trong thủ tục Enter Result đợc thiết kế giống nh trớc, thủ tục Init khởi tạo giá trị cha đợc lan cho tất phần t
3 Miền liên thông
Nu quan h kề cho tập hợp xét đối xứng (khi đồ thị tơng ứng gọi vơ hớng cạnh vơ hớng) - nghĩa A kề với B kéo theo B kề với A (vì ngời ta thờng nói trờng hợp chúng kề nhau), tập hợp xét đ-ợc chia thành lớp rời đơi lớp phủ kín tập hợp xét, cho hai phần tử lớp lan đợc sang hai phần tử khác lớp không lan đợc sang Ngời ta gọi lớp nh miền liên thông hay ngắn gọn -
miền - quan hệ kề cho Nh miền liên thông đợc xác định phần tử thuộc Mọi phần tử khác miền đợc nhận cách lan từ phần tử Để duyệt miền liên thông, cần đánh dấu phần tử đợc lan, trình duyệt đợc tiến hành cách phần tử cha đánh dấu lan phần tử khác Việc duyệt miền liên thơng mơ tả qua đoạn chơng trình: Init;
(3)if <X cha đợc lan> then Expand(X);
trong Init thủ tục khởi tạo giá trị cha đợc lan cho phần tử Expand(X) thủ tục lan X Thủ tục Expand(X) đợc thiết kế lan theo chiều rộng lan theo chiều sâu nh trình bày Mỗi lần thực thủ tục lần miền liên thông đợc xác định
Thơng thờng, q trình duyệt miền liên thông, ta muốn ghi nhận lại phần tử thuộc miền Để làm điều này, ngời ta thờng tổ chức mảng nguyên L[ ], với số chạy phần tử, ghi nhận số hiệu miền phần tử tơng ứng (các miền đợc đánh số hiệu 1, 2, ) Mảng dùng để ghi nhận phần tử tơng ứng đợc lan hay cha với quy ớc L[X] = nghĩa X cha đợc lan Đoạn chơng trình đợc sửa lại chút nh sau:
Init; k := 0;
For <X thuộc tập hợp phần tử> if L[X] = then
begin
k = k+1; Expand(X); end;
trong việc gán giá trị cha đợc lan cho X Init đợc thay việc gán cho L[X], thao tác đánh dấu cho phần tử đợc lan Y Expand(X) đợc thay thao tác gán giá trị k cho L[Y] Sau đoạn chơng trình, biến k lu trữ số miền liên thông xác định
Chú ý rằng, với quan hệ kề không đối xứng (tơng ứng với đồ thị có hớng), khơng có khái niệm miền liên thơng nh ó trỡnh by
4 Các toán lan bảng