Hôm trước thầy yêu cầu viết việc đếm phần không liên thông qua giải thuật Prim hoặc Kruscal. Ý tưởng của Phan Việt là cho mỗi đỉnh là một cây, rồi đưa dần các đỉnh ghép từng một cây khung, như vậy có n đỉnh thì sẽ có n vùng không liên thông ban đầu. Duyệt qua tất cả các cạnh, mỗi lần ghép 1 cạnh vào cây khung, vùng không liên thông sẽ giảm đi 1 (nghĩa là lấy n - 1). Cuối cùng sẽ có được n là số vùng không liên thông với nhau. Ở đây những lệnh không cần thiết sẽ bỏ đi, chỉ quan tâm đến những lệnh đánh dấu thôi, vì mình chỉ đếm thôi mà, ghép cây làm gì cho nó mệt vì chẳng giải quyết được gì.
Từ bài viết của LĐS ta có thể viết lại như sau thuật toán này.
- Nháy vào chỗ hồng hồng này để xem hoặc ẩn chi tiết:
Vùng_Liên_Thông = n;
For i:=1 to n do VT(i):=i;
For j=1 to m do
If VT(ds[j].d) != VT(ds[j].c) Then
Vùng_Liên_Thông--
tgd:= VT(ds[j].d);
tgc:= VT(ds[j].c);
for i:= 1 to n do
If VT(i) := tgd Then VT(i):=tgc;
Output Vùng_Liên_Thông
Vùng_Liên_Thông = n;
For i:=1 to n do VT(i):=i; Đánh dấu tất cả các đỉnh bằng số thứ tự đỉnh
For j=1 to m do Kiểm tra lần lượt m cạnh hiện có của đồ thị G
If VT(ds[j].d) != VT(ds[j].c) Then Nếu hai đầu của cạnh hiện tại đánh dấu không giống nhau: Thực hiện
tgd:= VT(ds[j].d); Ghi lại giá trị đánh dấu của đỉnh đầu cạnh đang xét
tgc:= VT(ds[j].c); Ghi lại giá trị đánh dấu của đỉnh cuối cạnh đang xét
for i:= 1 to n do Kiểm tra lần lượt các đỉnh:
If VT(i) := tgd Then VT(i):=tgc; Nêu đỉnh đầu nào mà có đánh dấu giống như giá trị lưu trong tgd thì thay giá trị đánh dấu bằng giá trị lưu trong tgc. Điều này nghĩa là sẽ đồng nhất các đỉnh đã nối sẽ cùng đánh dấu một giá trị. Khi đó những đỉnh đã nối vào với nhau sẽ không
nối nội bộ được nữa, điều này sẽ khiến không thể tạo thành chu trình bởi dòng lệnh
If VT(ds[j].d) != VT(ds[j].c) chỉ cho phép nối các đỉnh có đánh dấu khác nhau.
Vùng_Liên_Thông--
Output Vùng_Liên_Thông