给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N?1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v?1?? v?2?? ... v?k?? }"的格式,每行输出一个连通集。先输出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 }