当前位置:   article > 正文

链接表存储图(C++注释详解): 构建表 & 深度优先遍历 (DFS)

链接表存储图(C++注释详解): 构建表 & 深度优先遍历 (DFS)
链接表的结构体单元:
  1. #define size 100
  2. typedef struct node {
  3. int idx;//下一个节点的索引
  4. int wt;//权重, 也可根据实际情景存储边的信息
  5. struct node* next;
  6. }Node;
  7. Node* hd[size]; // 存储图的邻接表

链接表的的构建:

  1. int main()
  2. {
  3. int n, m;
  4. cin >> n >> m; // 输入节点数和边数
  5. for (int i = 0; i < n; i++) hd[i] = NULL; // 初始化邻接表为空
  6. int u, v, wt;//从u到v有一条权值为wt的有向线段
  7. for(int i = 0; i < m; i++) // 输入边的信息
  8. {
  9. cin >> u >> v >> wt;
  10. Node* t_node = (Node*)malloc(sizeof(Node)); // 创建新节点
  11. t_node->idx = v; // 设置新节点的索引
  12. t_node->wt = wt; // 设置新节点的权重
  13. if (hd[u] == NULL) // 如果之前还没有建立节点
  14. {
  15. t_node->next = NULL;
  16. hd[u] = t_node; // 将新节点设置为邻接表头节点
  17. }
  18. else
  19. {
  20. t_node->next = hd[u]->next;
  21. hd[u]->next = t_node; // 将新节点加入邻接表
  22. }
  23. }
  24. }

深度(DFS)优先遍历函数

  1. void DFS(int st)
  2. {
  3. Node* t_node = hd[st]; // 获取起始节点的邻接表头指针
  4. for (; t_node; t_node = t_node->next) // 遍历邻接表中的节点
  5. {
  6. int u = t_node->idx; // 获取相邻节点的索引
  7. if (!visited[u]) // 如果相邻节点未被访问过
  8. {
  9. cout << u << " "; // 输出相邻节点的索引
  10. visited[u] = true; // 标记相邻节点为已访问
  11. DFS(u); // 递归访问相邻节点
  12. }
  13. }
  14. }

总体代码实现:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define size 100
  4. typedef struct node {
  5. int idx;//下一个节点的索引
  6. int wt;//权重, 也可根据实际情景存储边的信息
  7. struct node* next;
  8. }Node;
  9. Node* hd[size]; // 存储图的邻接表
  10. bool visited[size]; // 标记节点是否被访问过
  11. void DFS(int st)
  12. {
  13. Node* t_node = hd[st]; // 获取起始节点的邻接表头指针
  14. for (; t_node; t_node = t_node->next) // 遍历邻接表中的节点
  15. {
  16. int u = t_node->idx; // 获取相邻节点的索引
  17. if (!visited[u]) // 如果相邻节点未被访问过
  18. {
  19. cout << u << " "; // 输出相邻节点的索引
  20. visited[u] = true; // 标记相邻节点为已访问
  21. DFS(u); // 递归访问相邻节点
  22. }
  23. }
  24. }
  25. int main()
  26. {
  27. int n, m;
  28. cin >> n >> m; // 输入节点数和边数
  29. for (int i = 0; i < n; i++) hd[i] = NULL; // 初始化邻接表为空
  30. int u, v, wt;
  31. for(int i = 0; i < m; i++) // 输入边的信息
  32. {
  33. cin >> u >> v >> wt;
  34. Node* t_node = (Node*)malloc(sizeof(Node)); // 创建新节点
  35. t_node->idx = v; // 设置新节点的索引
  36. t_node->wt = wt; // 设置新节点的权重
  37. if (hd[u] == NULL) // 如果之前还没有建立节点
  38. {
  39. t_node->next = NULL;
  40. hd[u] = t_node; // 将新节点设置为邻接表头节点
  41. }
  42. else
  43. {
  44. t_node->next = hd[u]->next;
  45. hd[u]->next = t_node; // 将新节点加入邻接表
  46. }
  47. }
  48. // 输入开始节点
  49. int st;
  50. cin >> st;
  51. // 深度优先搜索
  52. for (int i = 0; i < size; i++) visited[i] = false; // 初始化visited数组为false
  53. cout << st << " ";
  54. visited[st] = true;
  55. DFS(st);
  56. }

测试数据:

  1. /*
  2. 测试数据:
  3. 5 6
  4. 1 2 4
  5. 2 5 10
  6. 1 3 5
  7. 3 2 1
  8. 3 4 2
  9. 4 5 6
  10. */

上述数据对应图例:

~希望对你有帮助~

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

闽ICP备14008679号