DU YT CÁC THÀNH PH N LIÊN THÔNG CA TH

Một phần của tài liệu Toan roi rac (Trang 124 - 129)

M t đ th có th liên thông ho c không liên thông. N u đ th liên thông thì s thành ph n liên thông c a nó là 1. i u này t ng đ ng v i phép duy t theo th t c DFS() ho c BFS()đ c g i đ n đúng m t l n. N u đ th không liên thông (s thành ph n liên thông l n h n 1) chúng ta có th tách chúng thành nh ng đ th con liên thông. i u này c ng có ngh a là trong phép duy t

đ th , s thành ph n liên thông c a nó b ng s l n g i t i th t c DFS() ho c BFS().

xác đnh s các thành ph n liên thông c a đ th , chúng ta s d ng bi n m i soltđ nghi nh n các đnh cùng m t thành ph n liên thông trong m ng chuaxet[] nh sau:

- N u đnh i ch a đ c duy t, chuaxet[i] có giá tr 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 chúng có cùng giá tr trong m ng chuaxet[]. V i cách làm nh trên, th t c BFS() ho c DFS() có th đ c s a l i nh sau:

void BFS(int u){ queue = φ;

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 ≠φ ) {

queue<=p; /* l y p ra t stack*/ for v ∈ 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 t t c các thành ph n liên thông c a đ th , ta ch c n g i t i th t c lienthong nh d i đây:

void Lien_Thong(void){ for (i=1; i≤ n; i++) chuaxet[i] =0;

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

if(chuaxet[i]==0){ solt=solt+1; BFS(i);

}

}

ghi nh n t ng đnh c a đ th thu c thành ph n liên thông nào, ta ch c n duy t các đnh có cùng chung giá tr trong m ng chuaxet[] nh d i đây:

void Result( int solt){ if (solt==1){

< Do thi la lien thong>; }

/* 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>; } } }

Ví d . th vô h ng trong hình 6.3 s cho ta k t qu trong m ng chuaxet nh sau:

1 2 3

4 5 6 7

8 9

Hình 6.3. th vô h ng G=<V,E>.

S thành ph n liên thông K t qu th c hi n BFS Giá tr trong m ng chuaxet[]

0 Ch a th c hi n Chuaxet[] = {0,0,0,0,0,0,0,0,0} 1 BFS(1): 1, 2, 4, 5 Chuaxet[] = {1,1,0,1,1,0,0,0,0}

2 BFS(3): 3, 6, 7 Chuaxet[] = {1,1,2,1,1,2,2,0,0} 3 BFS(8): 8, 9 Chuaxet[] ={ 1,1,2,1,1,2,2,3,3} Nh v y, đnh 1, 2, 4, 5 cùng có giá tr 1 trong m ng chuaxet[] thu c thành ph n liên thông th 1;

nh 3, 6,7 cùng có giá tr 2 trong m ng chuaxet[] thu c thành ph n liên thông th 2; nh 8, 9 cùng có giá tr 3 trong m ng chuaxet[] thu c thành ph n liên thông th 3. V n b n ch ng trình đ c th hi n nh sau: #include <stdio.h> #include <conio.h> #include <io.h> #include <stdlib.h> #include <dos.h>

#define MAX 100 #define TRUE 1 #define FALSE 0

/* Breadth First Search */

void Init(int G[][MAX], int *n, int *solt, int *chuaxet){ FILE *fp; int i, j;

fp=fopen("lienth.IN", "r"); if(fp==NULL){

printf("\n Khong co file input"); delay(2000);return;

}

fscanf(fp,"%d", n);

printf("\n So dinh do thi:%d",*n); printf("\n Ma tran ke cua do thi:"); for(i=1; i<=*n;i++){ printf("\n"); for(j=1; j<=*n;j++){ fscanf(fp,"%d", &G[i][j]); printf("%3d", G[i][j]); } } for(i=1; i<=*n;i++) chuaxet[i]=0; *solt=0; }

void Result(int *chuaxet, int n, int solt){ printf("\n\n");

if(solt==1){

printf("\n Do thi la lien thong"); getch(); return;

}

printf("\n Thanh phan lien thong thu %d:",i); for(int j=1; j<=n;j++){ if( chuaxet[j]==i) printf("%3d", j); } } }

void BFS(int G[][MAX], int n, int i, int *solt, int chuaxet[], int QUEUE[MAX]){ int u, dauQ, cuoiQ, j;

dauQ=1; cuoiQ=1;QUEUE[cuoiQ]=i;chuaxet[i]=*solt; while(dauQ<=cuoiQ){

u=QUEUE[dauQ];printf("%3d",u);dauQ=dauQ+1; for(j=1; j<=n;j++){

if(G[u][j]==1 && chuaxet[j]==0){ cuoiQ=cuoiQ+1; QUEUE[cuoiQ]=j; chuaxet[j]=*solt; } } } } void Lien_Thong(void){

int G[MAX][MAX], n, chuaxet[MAX], QUEUE[MAX], solt,i; clrscr();Init(G, &n,&solt, chuaxet);

printf("\n\n"); for(i=1; i<=n; i++)

if(chuaxet[i]==0){ solt=solt+1;

BFS(G, n, i, &solt, chuaxet, QUEUE);

}

Result(chuaxet, n, solt); getch();

}

void main(void){ Lien_Thong(); }

Một phần của tài liệu Toan roi rac (Trang 124 - 129)