1.DFS (Depth First Search) 深度优先搜索

其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次

DFS.png

  1. //表结点
  2. struct ArcNode {
  3. int adfvex;//表示该边的另外一个顶点在顶点表中的下标
  4. ArcNode * next; //表示依附在该顶点的下一条边的信息
  5. };
  6. //头结点
  7. struct Vnode {
  8. string data; //记录基本信息i
  9. ArcNode * firstarc;//记录第一条依附在该顶点的边
  10. };
  11. //一个图的结构
  12. struct Graph_List {
  13. int vexnum; //图的顶点数
  14. int edge; //图的边数
  15. Vnode * node; //邻接表
  16. };
  17. //DFS遍历图
  18. void DFS_store_list(Graph_List g, int v, bool * & visit) {
  19. cout << g.node[v].data << " ";
  20. visit[v] = true;
  21. ArcNode * next = g.node[v].firstarc;
  22. while (next) {
  23. if (!visit[next->adfvex]) {
  24. DFS_store_list(g, next->adfvex, visit);//递归
  25. }
  26. else {
  27. next = next->next;
  28. }
  29. }
  30. }
  31. void DFS_list(Graph_List g, int begin) {
  32. int i;
  33. bool * visit = new bool[g.vexnum];
  34. for (i = 0; i < g.vexnum; i++) {
  35. visit[i] = false;
  36. }
  37. DFS_store_list(g, 0, visit);
  38. for (i = 1; i < g.vexnum; i++) {
  39. if(!visit[i])
  40. DFS_store_list(g, i, visit);
  41. }
  42. }

2.BFS (Breadth First Search) 广度优先搜索

1任意点v出发=>访问v ->访问v的邻接点

2.v的邻接点出发 ->访问v的邻接点的邻接点

“先被访问的顶点的邻接点”先于”后被访问的邻接点”访问,直至图中所有的顶点都被访问到为止

BFS.png

  1. //表结点
  2. struct ArcNode {
  3. int adfvex;//表示该边的另外一个顶点在顶点表中的下标
  4. ArcNode * next; //表示依附在该顶点的下一条边的信息
  5. };
  6. //头结点
  7. struct Vnode {
  8. string data; //记录基本信息i
  9. ArcNode * firstarc;//记录第一条依附在该顶点的边
  10. };
  11. //一个图的结构
  12. struct Graph_List {
  13. int vexnum; //图的顶点数
  14. int edge; //图的边数
  15. Vnode * node; //邻接表
  16. };
  17. //BFS遍历图
  18. void BFS_list(Graph_List g, int begin) {
  19. int i;
  20. bool * visit = new bool[g.vexnum];
  21. for (i = 0; i < g.vexnum; i++) {
  22. visit[i] = false;
  23. }
  24. queue<int> q;
  25. for (int v = 0; v < g.vexnum; v++) {
  26. if (!visit[(begin + v) % g.vexnum])
  27. {
  28. cout << g.node[(begin - 1 + v) % g.vexnum].data << " ";
  29. visit[(begin + v) % g.vexnum] = true;
  30. q.push((begin + v) % g.vexnum);//初始化队列
  31. while (!q.empty())
  32. {
  33. int u = q.front();
  34. q.pop();
  35. ArcNode * next;
  36. next = g.node[u].firstarc;//获得依附在该顶点的第一条边的信息
  37. while (next) {//遍历该链表上的所有的点
  38. if (!visit[next->adfvex]) {
  39. cout << g.node[next->adfvex].data << " ";
  40. visit[next->adfvex] = true;
  41. q.push(next->adfvex);
  42. }
  43. next = next->next;
  44. }
  45. }
  46. }
  47. }
  48. }