給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N−1編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。
輸入格式:
輸入第1行給出2個整數N(0<N≤10)和E,分別是圖的頂點數和邊數。隨后E行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。
輸出格式:
按照"{ v1 v2 ... vk }"的格式,每行輸出一個連通集。先輸出DFS的結果,再輸出BFS的結果。
輸入樣例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
輸出樣例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
解題思路:1.數據量不大使用鄰接矩陣來表示圖,個人感覺用矩陣比較簡單一些
2.然后就是鄰接矩陣的深度遍歷跟廣度遍歷,這里注意下大括號{}的輸出即可
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define MAXVEX 15 5 6 void CreateGraph( ); 7 void DFS( int i); 8 void DFSTraverse(); 9 void BFSTraverse(); 10 11 int G[MAXVEX][MAXVEX],Nv,Ne; 12 int visited[MAXVEX]; 13 14 int main() 15 { 16 CreateGraph(); 17 DFSTraverse(); 18 BFSTraverse(); 19 return 0; 20 } 21 22 void CreateGraph() 23 { 24 //用鄰接矩陣表示圖 25 int i,j; 26 int v1,v2; 27 scanf("%d %d",&Nv,&Ne); 28 for( i=0; i<Nv; i++) 29 { 30 for( j=0; j<Nv; j++) 31 { 32 G[i][j] = 0; //初始化 33 } 34 } 35 for( i=0; i<Ne; i++) //注意這里是讀入邊 36 { 37 scanf("%d %d",&v1,&v2); 38 G[v1][v2] = 1; 39 G[v2][v1]= G[v1][v2]; //無向圖對稱 40 } 41 } 42 43 void DFS( int i) 44 { 45 int j; 46 47 visited[i] = 1; 48 printf("%d ",i); 49 for( j=0; j<Nv; j++) 50 { 51 if( G[i][j] && !visited[j]) 52 { 53 //如果存在ij之間的連線且j並未被訪問過 54 DFS (j); 55 } 56 } 57 } 58 void DFSTraverse( ) 59 { 60 int i; 61 62 for( i=0; i<Nv; i++) 63 { 64 visited[i] = 0; //初始化訪問矩陣 65 } 66 for ( i=0; i<Nv; i++) 67 { 68 if( !visited[i]) 69 { 70 printf("{ "); 71 DFS(i); 72 printf("}\n"); 73 } 74 } 75 } 76 77 void BFSTraverse( ) 78 { 79 int q[MAXVEX]={0}; //用數組表示隊列 80 int rear=-1,front=-1; 81 int i,j; 82 int temp; 83 84 for( i=0; i<Nv; i++) 85 { 86 visited[i] = 0; 87 } 88 89 for( i=0; i<Nv; i++){ 90 if( !visited[i]){ 91 printf("{ "); 92 visited[i] =1; 93 q[++rear] = i; //入隊 94 while( front<rear ){ //判斷隊列是否為空 95 temp =q[++front]; //出隊 96 printf("%d ",temp); 97 for( j=0; j<Nv;j++){ 98 if( G[temp][j] && !visited[j]){ 99 visited[j] = 1; 100 q[++rear] = j; 101 } 102 } 103 } 104 printf("}\n"); 105 } 106 } 107 108 }