Admin đã viết:Chương trình giả mã của Hà Thị có thể trình bày lại theo đúng dạng mẫu của thầy, như sau:
- Nháy vào khung màu hồng này để hiện, ẩn:
1. Sắp xếp các danh sách cạnh sao cho: |
ds[1].t ≤ ds[2].t ≤...≤ ds[m].t |
2. FOR i := 1 TO n DO | VT[i]:=0; | | |
3. k := 1; T[ds[1].d] := 1; | E'[k] = ds[1]; T[ds[1].c]:=1; | m = m + ds[1].t; | |
4. WHILE (k < n - 1) DO | | |
| j: = 2; stop := false; | | |
| WHILE (!stop) DO | | |
| j: = 2; IF (VT[ds[j].d] != VT[ds[j].c]]) THEN |
| | k++; | |
| | E'[k] := ds[j]; | |
| | m = m + ds[j].t; | |
| | VT[ds[j].d] := 1; | |
| | VT[ds[j].c] := 1; | |
| | stop := true; | |
| ELSE | j++; | |
5. OUTPUT E', m | | | |
Để làm rõ từng dòng lệnh, ta sẽ xem xét căn cứ vào thực tế nha.
1. Đầu tiên đề bài cho cấu trúc dữ liệu được lưu trữ dưới dạng record có tên là DS. Nó có 3 trường gồm d: đỉnh đầu, c: đỉnh cuối và t là trọng số. Khi sắp xếp
ds[1].t <= ds[2].t<=...<= ds[m].t có nghĩa là sắp trọng số tăng dần. Quá dễ hiểu, thôi đoạn này bỏ qua nha.
2. Tiếp theo đoạn:
FOR i:=1 to n rồi đặt
VT[i]:=0; là Hà Thị đã reset đặt lại tất cả cái mảng theo dõi trạng thái của các đỉnh về 0. Uh, lẽ ra đặt tên dễ gợi nhớ đi 1 chút thì khó quên hơn, ví dụ như TD là theo dõi chẳng hạn. Thôi, không sao, VT thì VT. Nhớ VT là theo dõi đó nhen,
i là đỉnh thứ mấy đó.
3. Dòng này đặt
k = 1 để đánh dấu rằng, bắt đầu lấy cạnh đầu tiên,
k này vừa là số thứ tự, vừa là cạnh thứ mấy đó nhen.
Đặt
E'[k]=ds[1]; nghĩa là cạnh thứ k (vừa gán = 1 ở trên) bằng cạnh 1 trong danh sách ds. Đã đặt cả cạnh là 2 đầu mút rồi, Mrp nói cần đánh dấu 2 đỉnh này, nên cần thêm dòng đánh dấu 1 đầu này,
T[ds[1].d]:=1; VT[ds[1].c]:=1;. quên đánh dấu 2 đỉnh này sẽ bị biến thành chu trình phần sau, OK.
Đặt
m= m+ ds[1].t; là nàng đo độ dài của cạnh thứ nhất (lấy trọng số
ds[1].t), đưa vào tổng độ dài của cây khung. Việc đặt tên biến cũng không được rõ ràng tường minh cho lắm, ví dụ đặt là daick (dài cây khung chẳng hạn) thì có lẽ dễ theo dõi hơn. Nhưng thôi, bỏ qua tiểu tiết, nhớ là
m là đo độ dài cây khung đó nhen.
4.
WHILE (k< n-1) do: Câu này quá dễ, chừng nào cây khung chưa đủ số cạnh = n-1 thì quyết kiếm cho đủ ! Tạm gọi vòng lặp này là
vòng kiếm đủ số cạnh cho cây khung.
j:=2 Xét từ cặp thứ 2: Rất khôn. Xem bình luận dưới.
stop:= false; khởi tạo biến cờ, không có
thôi gì cả, bao giờ xong, báo
thôi thì mới thôi. Biến này dùng cho vòng FOR ở trong.
WHILE (!stop) do: Chừng nào chưa thôi thì cứ làm! Tạm gọi vòng này là
vòng kiếm cho được 1 cạnh mới thôi.
if (VT[ds[j].d] != VT[ds[j].c]]) THEN Nếu đỉnh đầu và đỉnh cuối của phần tử thứ j trong danh sách,
đánh dấu khác nhau thì:
k++ đếm luôn: thêm 1 đỉnh
E'[k]:= ds[j]; Cạnh thứ k bằng phần tử thứ j trong (danh sách cạnh đã sắp xếp ở đầu rồi)
m = m + ds[j].t; Đo luôn trọng số, đưa vào độ dài cây khung.
VT[ds[j].d]:=1; VT[ds[j].c]] = 1: Đánh dấu luôn 2 đỉnh này là 1.
Chả sao cả,
vì chẳng biết được đỉnh nào chưa đánh dấu,
nếu nó đã được đánh dấu là 1 ở vòng trước rồi thì đánh lại chẳng sao, đỡ phải kiểm tra. Lưu ý là bên trên đã
If (VT[ds[j].d] != VT[ds[j].c]]) có nghĩa là kiểm tra một đỉnh đã có dấu (1) và một đỉnh chưa có dấu (0) mới làm các bước trên. Ở đây không phải xét lung tung mà
bản chất là xét phần tử thứ j của danh sách cạnh đã sắp xếp, xét 2 đỉnh đầu cuối của nó.
stop = true: Đặt biến cờ cho vòng lặp này thôi. Nghĩa là đặt được thì thôi luôn, còn chưa đặt được thì xét cặp đỉnh khác.
ELSE j++ Còn trường hợp khác, tăng j lên để xét phần tử kế tiếp trong danh sách cạnh đã sắp xếp.
Thoát khỏi
vòng lặp kiếm 1 cạnh, quay lại đầu
vòng lặp kiếm đủ số cạnh, thấy ngay
j: = 2, nhiều người bỏ quên cái câu
j = 2 là chết oan ngay, vì phải
xét lại từ đầu danh sách, để tránh bỏ sót. Khi làm bằng tay, ta để ý là có chỗ nhảy cách xuống phần kế danh sách, mà
bên trên có phần tử lúc ý chưa thoả mãn, nhưng
bây giờ nó mới thoả mãn thì ta lại lấy vào. Nghĩa là luôn luôn xét từ đầu danh sách, mỗi khi lấy xong một cạnh.
5. Xong thì đưa nó ra bằng output, đưa ra các cạnh của cây khung E' và độ dài của cả cây khung m.
Khách viếng thăm xem lại bình luận xem có cần thiết phải bổ sung không nha!
[You must be registered and logged in to see this link.]