当前位置:   article > 正文

图的遍历算法之深度优先遍历(DFS)(C++)_图的深度优先遍历

图的深度优先遍历

图的深度优先遍历思想是:

从图中某结点出发,访问其某一相邻结点,再访问该结点的相邻结点,直至访问完所有的结点。

形象的比喻就是:一条路走到头,回头再走没走过的路。

可见,深度优先遍历是一种递归思想;

需要注意的是:

对于图的邻接矩阵存储和邻接表存储,深度优先遍历输出的次序有有一定去别的。

对于邻接矩阵而言,DFS和BFS得到的序列是唯一的;

对于邻接表而言,DFS和BFS输入的序列不同,得到的输出序列也不相同。


深度优先遍历的核心算法 :

  1. void DFS(GraAdList G, int v) {
  2. EdgeNode* p;
  3. int j;
  4. cout << G.AdList[v].data << " ";
  5. visited[v] = 1;
  6. p = G.AdList[v].first;
  7. while (p)
  8. {
  9. j = p->adjvex;
  10. if (visited[j] == 0)
  11. {
  12. DFS(G, j);
  13. }
  14. p = p->next;
  15. }
  16. }
  17. void DFS(GraAdList G)
  18. {
  19. for (int i = 0; i < G.vexnum; i++)
  20. {
  21. if (visited[i] == 0)
  22. {
  23. DFS(G, i);
  24. }
  25. }
  26. }

完整代码实现:

  1. #include<iostream>
  2. using namespace std;
  3. #define MAX 6
  4. int visited[MAX];
  5. int D[MAX] = { 9999 };
  6. typedef struct EdgeNode {
  7. int adjvex;
  8. EdgeNode* next;
  9. };
  10. typedef struct VexNode {
  11. char data;
  12. EdgeNode* first;
  13. };
  14. typedef struct GraAdList {
  15. VexNode AdList[MAX];
  16. int vexnum;
  17. int edgenum;
  18. };
  19. //创建邻接矩
  20. void Creat(GraAdList& G) {
  21. int i, j, k;
  22. EdgeNode* e = NULL;
  23. EdgeNode* q = NULL;
  24. cout << "请输入顶点数和边数: " << endl;
  25. cin >> G.vexnum >> G.edgenum;
  26. cout << "请输入顶点信息" << endl;
  27. for (k = 0; k < G.vexnum; k++)
  28. {
  29. cin >> G.AdList[k].data;
  30. G.AdList[k].first = NULL;
  31. }
  32. for (k = 0; k < G.edgenum; k++)
  33. {
  34. cout << "请输入边(vi,vj)的下标i,j: " << endl;
  35. cin >> i >> j;
  36. e = new EdgeNode;
  37. e->adjvex = j;
  38. e->next = G.AdList[i].first;
  39. G.AdList[i].first = e;
  40. }
  41. }
  42. void myprint(GraAdList G) {
  43. cout << endl << "邻接表: " << endl;
  44. EdgeNode* p;
  45. for (int i = 0; i < G.vexnum; i++)
  46. {
  47. cout << G.AdList[i].data << ": ";
  48. for (p = G.AdList[i].first; p; p = p->next)
  49. {
  50. cout << p->adjvex << " ";
  51. }
  52. cout << endl;
  53. }
  54. }
  55. void DFS(GraAdList G, int v) {
  56. EdgeNode* p;
  57. int j;
  58. cout << G.AdList[v].data << " ";
  59. visited[v] = 1;
  60. p = G.AdList[v].first;
  61. while (p)
  62. {
  63. j = p->adjvex;
  64. if (visited[j] == 0)
  65. {
  66. DFS(G, j);
  67. }
  68. p = p->next;
  69. }
  70. }
  71. void DFS(GraAdList G)
  72. {
  73. for (int i = 0; i < G.vexnum; i++)
  74. {
  75. if (visited[i] == 0)
  76. {
  77. DFS(G, i);
  78. }
  79. }
  80. }
  81. int main() {
  82. GraAdList G;
  83. Creat(G);
  84. myprint(G);
  85. for (int i = 0; i < G.vexnum; i++)
  86. {
  87. visited[i] = 0;
  88. }
  89. cout << endl << "深度遍历: " << endl;
  90. DFS(G, 0);
  91. return 0;
  92. }

执行结果:

我创建的图:

 

 

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

闽ICP备14008679号