Liên thông

Duyệt thành phần liên thông có thể dùng BFS hoặc DFS

Nếu đồ thị có số thành phần liên thông > 1 =>  đồ thị không liên thông.

Ta sử dụng biến solt để ghi nhận các đỉnh cùng 1 thành phần liên thông trong mảng chuaxet[]

-          Nếu đỉnh i chưa được duyệt, chuaxet[i] == 0;

-          Nếu đỉnh i được duyệt thuộc thành phần liên thông thứ j = solt; ta ghi nhận chuaxet[i] = solt;

-          Các đỉnh cùng thành phần liên thông nếu có cùng giá trị trong mảng chuaxet[].

void BFS(int u) {

queue = rỗng;

u ← queue; /*nạp u vào hàng đợi*/

solt = solt + 1;

chuaxet[u] = solt; /*solt là biến toàn cục thiết lập giá trị 0*/

while (queue ≠ rỗng )    { 

      queue ← p; /*lấy p ra từ stack*/

for (v 'thuộc' ke(p) ) { 

            if (chuaxet[v]  ) {

                        v ← queue; /*nạp v vào hàng đợi*/

                        chuaxet[v] = solt; /*v có cùng thành phần liên thông với p*/

                        }

            }

}

}

Để duyệt hết các thành phần liên thông của đồ thị, ta chỉ cần

void Lien_Thong (void) {

      for (i=1; i<=n; i++)

      chuaxet[i] = 0; // khởi tạo mảng chuaxet[]

      for (i=1; i<=n; i++)

                  if (chuaxet[i] == 0) {

solt = solt + 1;

                                    BFS(i);

                        }

}

Để ghi nhận từng đỉnh thuộc thành phần liên thông nào, ta chỉ cần:

void Result( int solt) {

            if (solt == 1) {

            <Đồ thị là liên thông>;

            }

            for (i=1; i<=solt; i++) {

/*Đưa ra thành phần liên thông thứ i*/

            for (j=1; j<=n; j++) {

            if (chuaxet[j] == i)

            <Đưa ra đỉnh j> ;

}

}

}

Bạn đang đọc truyện trên: AzTruyen.Top

Tags: #leez