7-6 列出连通集(25 分)(广度优先遍历和深度优先遍历)

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0<N10)和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
  2 #include
  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)
 29     {
 30         for( j=0; j)
 31         {
 32             G[i][j] = 0;  //初始化
 33         }
 34     }
 35     for( i=0; 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)
 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)
 63     {
 64         visited[i] = 0;  //初始化访问矩阵
 65     }
 66     for ( i=0; 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)
 85     {
 86         visited[i] = 0;
 87     }
 88 
 89     for( i=0; i){
 90         if( !visited[i]){
 91             printf("{ ");
 92             visited[i] =1;
 93             q[++rear] = i;  //入队
 94             while( front//判断队列是否为空
 95                 temp =q[++front];  //出队
 96                 printf("%d ",temp);
 97                 for( j=0; 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 }

 






转载于:https://www.cnblogs.com/yuxiaoba/p/8335758.html

你可能感兴趣的:(7-6 列出连通集(25 分)(广度优先遍历和深度优先遍历))