当前位置:   article > 正文

邻接矩阵存储图并深度优先搜索遍历_根据邻接矩阵写出深度优先遍历

根据邻接矩阵写出深度优先遍历

采用邻接矩阵形式存储图,对图进行优先深度搜索,并输出结果。


 算法设计

      用邻接矩阵存储图首先定义图的邻接矩阵存储结构,其中一维数组vertexs用来表示与顶点有关的信息,二维数组arcs用来表示图中顶点之间的关系。

     之后要初始化邻接矩阵,初始化顶点个数以及边的个数,输入数据并且添加权值然后输出矩阵。

     深度优先搜索然后遍历,最后输出搜索遍历后的顺序。

     深度优先遍历类似于树的先根遍历,是树先根遍历的推广。深度优先遍历是个递归过程,所以这个算法可以用递归实现。从某个结点v出发,进行优先遍历图的算法采用递归的形式说明如下:(1)设置访问标识数组并初始化标识数组。

(2)若访问过顶点,则该标识设置为1,并输出当前顶点。

(3)若某个顶点没有被访问过,则继续进行遍历此顶点。

(4)继续找下一个邻接点,递归递归进行遍历,直到所有顶点都被访问。

设计的函数如下:

InitG()

初始化邻接矩阵

Init_Vertex()

初始化矩阵中的顶点个数

Init_Arc()

初始化矩阵中的边数

InSerG()

插入邻接矩阵中的数据

InWeight()

在矩阵中添加连接顶点之间的信息 ,即为图的权值

Print()

输出邻接矩阵

Init_DFS()

深度优先搜索函数

DFS()

深度优先遍历函数

main()

主函数用来测试该算法功能

源代码:

  1. /************
  2. date:2021-11-27
  3. version:1.0
  4. author:sy
  5. Description:采用邻接矩阵存储图,进行图的深度优先搜索并输出结果
  6. **************/
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #define MAXNUM 100
  10. /* 邻接矩阵数据结构体 */
  11. typedef struct {
  12. int vexnum, arcnum; // 图的顶点数和弧数
  13. int vertexs[MAXNUM]; // 存储顶点的一维数组
  14. int arcs[MAXNUM][MAXNUM]; // 邻接矩阵
  15. }graph,*Graph;
  16. typedef struct Arc{
  17. int v1; // 用来存放第一个顶点
  18. int v2; // 用来存放第二个顶点
  19. int weight; // 权值
  20. }*ArcType;
  21. /* 初始化邻接矩阵 */
  22. void InitG(Graph G,int Vertex)
  23. {
  24. G->arcnum = 0; // 初始化为0条边
  25. G->vexnum = Vertex; // 初始化顶点数
  26. int i,j;
  27. for(i=0;i<Vertex;i++)
  28. {
  29. for(j=0;j<Vertex;j++)
  30. {
  31. G->arcs[i][j] = 0;
  32. }
  33. }
  34. }
  35. /* 初始化顶点个数 */
  36. int Init_Vertex()
  37. {
  38. int Vertex;
  39. printf("请输入顶点个数(回车键结束): ");
  40. scanf("%d",&Vertex);
  41. return Vertex;
  42. }
  43. /* 初始化边的数量 */
  44. int Init_Arc()
  45. {
  46. int arc;
  47. printf("请输入边的数量(回车键结束): ");
  48. scanf("%d",&arc);
  49. return arc;
  50. }
  51. void InWeight(Graph G,ArcType T);
  52. /* 开始插入数据 */
  53. void InSerG(Graph G,int edge,int V)
  54. {
  55. int i,j;
  56. if(edge>0) // 边数大于0的时候才插入数据
  57. {
  58. printf("请输入顶点和权值(空格分隔,回车结束)\n");
  59. for(i=0;i<edge;i++)
  60. {
  61. ArcType T; // 分配内存,接受顶点v1,v2和权值
  62. T = (ArcType)malloc(sizeof(struct Arc));
  63. scanf("%d %d %d",&(T->v1),&(T->v2),&(T->weight));
  64. if(T->v1 ==T->v2)
  65. {
  66. printf("无向图邻接矩阵对角线为0,输入错误,结束运行\n");
  67. exit(-1);
  68. }
  69. InWeight(G,T);
  70. }
  71. printf("请输入要创建的顶点(空格隔开,回车结束): \n");
  72. for(j=0;j<V;j++)
  73. {
  74. scanf("%d",&(G->vertexs[j]));
  75. }
  76. }else printf("输入的边数错误");
  77. }
  78. /* 在矩阵中添加连接顶点之间的信息 ,即为图的权值*/
  79. void InWeight(Graph G,ArcType T)
  80. {
  81. G->arcs[T->v1][T->v2] = T->weight;
  82. G->arcs[T->v2][T->v1] = T->weight;
  83. }
  84. /* 输出邻接矩阵 */
  85. void Print(Graph p,int Vertex)
  86. {
  87. int i,j;
  88. for(i=0;i<Vertex;i++)
  89. {
  90. for(j=0;j<Vertex;j++)
  91. {
  92. printf("%4d",p->arcs[i][j]); // 打印邻接矩阵
  93. }
  94. putchar('\n');
  95. }
  96. }
  97. int visited[MAXNUM]; //访问标识数组
  98. void DFS (Graph G,int v,int V); //声明函数
  99. /* 深度优先搜索 */
  100. void Init_DFS (Graph G,int V)
  101. {
  102. int i;
  103. for(i=0;i<V;i++) /*初始化标识数组,全为0*/
  104. {
  105. visited[i] = 0;
  106. }
  107. for(i=0;i<V ;i++) // 检查每一个顶点是否被遍历到
  108. {
  109. if(!visited[i])
  110. DFS (G,i,V); // 开始深度遍历
  111. }
  112. putchar('\n');
  113. }
  114. /*深度优先遍历*/
  115. void DFS (Graph G,int v,int V)
  116. {
  117. int i;
  118. visited[v] = 1;
  119. printf("%d ",G->vertexs[v]); // 输出当前顶点
  120. for(i=0;i<V ;i++)
  121. {
  122. if(!visited[i] && G->arcs[v][i] != 0) // 如果当前顶点的邻近点存在,且没有遍历过
  123. { // 则继续递归遍历
  124. DFS ( G,i,V ); // 递归遍历当前顶点的邻近点
  125. }
  126. }
  127. }
  128. int main()
  129. {
  130. int Vernum;
  131. int arc;
  132. Graph P; // 邻接矩阵头节点指针
  133. Vernum = Init_Vertex(); /*创建邻接矩阵*/
  134. arc = Init_Arc();
  135. P = (Graph)malloc(sizeof(graph)); //分配存储空间
  136. P->vexnum = Vernum; // 记录顶点个数
  137. P->arcnum = arc; // 记录边的个数
  138. InitG(P,Vernum); // 初始化邻接矩阵
  139. InSerG(P,arc,Vernum); // 插入数据
  140. printf("无向图邻接矩阵如下:");
  141. printf("\n---------\n\n");
  142. Print(P,Vernum);
  143. printf("\n---------\n");
  144. printf("深度优先搜索遍历邻接矩阵结果为:\n");
  145. Init_DFS (P,Vernum);
  146. return 0;
  147. }

 

测试

 在这里输入顶点需要从0开始,因为数组下标是从[0][0]开始的。

构造一颗无向图如下:

 

深度优先遍历搜索遍历的结果为:1 2 4 3 5

测试结果如下:

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

闽ICP备14008679号