当前位置:   article > 正文

无向图-邻接矩阵深度优先遍历-DFS_7-1 无向图的深度优先遍历 无向图(网)采用邻接矩阵结构。假设总是从第一个顶点出

7-1 无向图的深度优先遍历 无向图(网)采用邻接矩阵结构。假设总是从第一个顶点出

一、算法思想

DFS

本算法以无向网为例,存储方式采用邻接矩阵

1)将该网以邻接矩阵的方式存储,由于这里的示例采用无向图,因此它是一个对称阵
2)选取A点为起始点,访问此顶点,用一个visit的bool型数组记录访问状态(false表示未被访问,true表示已访问)
3)从A的未被访问的邻接点出发,深度优先遍历图,直到图中所有和v有路径相通的顶点都被访问到

二、算法复杂度:O(n^2)

        存储方式采用邻接矩阵,本身是一个二维数组,要查找每个顶点的邻接点都需要访问矩阵中的所有元素,因此需要O(n^2)的时间


三、算法测试用例

    本算法的测试用例为《大话数据结构》p239中的图7-5-2,如下图所示:


四、C代码邻接矩阵的DFS实现

  1. /*******************************************************************************************
  2. 【DFS】
  3. Author:tmw
  4. date:2018-2-19
  5. ********************************************************************************************/
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <stdbool.h>
  9. #define MAX_VERTEX 100
  10. #define inf 65535 //表示两点之间没有边相连
  11. int visit[MAX_VERTEX]; //标记顶点是否被访问
  12. /**图的邻接矩阵的建立**/
  13. //邻接矩阵数据结构定义
  14. typedef struct Martrix_Graph
  15. {
  16. char vertex[MAX_VERTEX]; //存储顶点信息
  17. int edge[MAX_VERTEX][MAX_VERTEX]; //存储边信息
  18. int vertex_number,edge_number;//存储顶点数和边数
  19. }Martrix_Graph;
  20. void Create_non_direction_martrix_Graph( Martrix_Graph *G )
  21. {
  22. int i,j,k,m;
  23. printf("请输入构造的无向图的顶点数和边数:\n");
  24. scanf("%d %d",&G->vertex_number,&G->edge_number);
  25. printf("请输入无向图顶点信息(如ABCDEF....):\n");
  26. char ch;
  27. while( ( ch = getchar() != '\n' ) ); //过滤掉前面的\n,防止\n被scanf进去
  28. for(i=0;i<G->vertex_number;i++)
  29. scanf("%c",&G->vertex[i]);
  30. //不相连的顶点之间的权值设为inf,包括顶点自身
  31. //初始化邻接矩阵
  32. for(i=0;i<G->vertex_number;i++)
  33. for(j=0;j<G->vertex_number;j++)
  34. G->edge[i][j] = inf;
  35. //更新无向图边信息
  36. printf("请输入无向图邻接矩阵相连的边信息,相连标记为1\n");
  37. for(k=0;k<G->edge_number;k++)
  38. {
  39. scanf("%d %d %d",&i,&j,&m);
  40. G->edge[i][j] = m;
  41. G->edge[j][i] = G->edge[i][j];//无向图是对称阵
  42. }
  43. //打印邻接矩阵存储信息,检查正确性
  44. printf("---------------------构造出来的无向图邻接矩阵如下---------------------\n");
  45. for(i=0;i<G->vertex_number;i++)
  46. {
  47. for(j=0;j<G->vertex_number;j++)
  48. printf("%d\t",G->edge[i][j]);
  49. printf("\n");
  50. }
  51. }
  52. //从当前第i个顶点出发,DFS遍历
  53. void DFS(Martrix_Graph G, int i)
  54. {
  55. int j;
  56. //标记当前顶点为已访问状态
  57. visit[i] = true;
  58. printf("%c ",G.vertex[i]);
  59. //对与该顶点相连的其他未访问顶点进行DFS
  60. for(j=0;j<G.vertex_number;j++)
  61. {
  62. if( G.edge[i][j]==1 && !visit[j] )
  63. DFS(G,j);
  64. }
  65. }
  66. //对整个图进行DFS
  67. void DFS_Travel(Martrix_Graph G)
  68. {
  69. //初始化visit数组
  70. int i;
  71. for(i=0;i<G.vertex_number;i++)
  72. visit[i] = false;
  73. //整张图的DFS
  74. printf("对该无向图进行DFS的结果如下:\n");
  75. for(i=0;i<G.vertex_number;i++)
  76. {
  77. if( !visit[i] )
  78. DFS(G,i);
  79. }
  80. }

五、测试程序及运行结果

  1. int main()
  2. {
  3. printf("测试代码\n");
  4. Martrix_Graph G;
  5. Create_non_direction_martrix_Graph(&G);
  6. DFS_Travel(G);
  7. return 0;
  8. }

运行结果:



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/596651
推荐阅读
相关标签
  

闽ICP备14008679号