图的遍历之深度优先遍历DFS

古城微笑少年丶 2023-03-12 12:19 111阅读 0赞

GraphBasicOperation.cpp文件链接:https://blog.csdn.net/qq_16261421/article/details/106005857

深度优先搜索遍历的过程是:

  (1)从图中某个初始顶点v出发,首先访问初始顶点v

  (2)选择一个与顶点v相邻且没被访问过的顶点w为初始顶点,再从w出发进行深度优先搜索,直到图中与当前顶点v邻接的所有顶点都被访问过为止。  

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2MjYxNDIx_size_16_color_FFFFFF_t_70

  1. #include "GraphBasicOperation.cpp"
  2. void BFS(ALGraph *G,int v)
  3. {
  4. ArcNode *p;
  5. int queue[MAXV],front=0,rear=0; //定义循环队列并初始化
  6. int visited[MAXV]; //定义存放结点的访问标志的数组
  7. int w,i;
  8. for (i=0;i<G->n;i++) visited[i]=0; //访问标志数组初始化
  9. printf("%2d",v); //输出被访问顶点的编号
  10. visited[v]=1; //置已访问标记
  11. rear=(rear+1)%MAXV;
  12. queue[rear]=v; //v进队
  13. while (front!=rear) //若队列不空时循环
  14. {
  15. front=(front+1)%MAXV;
  16. w=queue[front]; //出队并赋给w
  17. p=G->adjlist[w].firstarc; //找与顶点w邻接的第一个顶点
  18. while (p!=NULL)
  19. {
  20. if (visited[p->adjvex]==0) //若当前邻接顶点未被访问
  21. {
  22. printf("%2d",p->adjvex); //访问相邻顶点
  23. visited[p->adjvex]=1; //置该顶点已被访问的标志
  24. rear=(rear+1)%MAXV; //该顶点进队
  25. queue[rear]=p->adjvex;
  26. }
  27. p=p->nextarc; //找下一个邻接顶点
  28. }
  29. }
  30. printf("\n");
  31. }
  32. void main()
  33. {
  34. int i,j;
  35. MGraph g;
  36. ALGraph *G;
  37. int A[MAXV][5]={
  38. {0,1,0,1,1},
  39. {1,0,1,1,0},
  40. {0,1,0,1,1},
  41. {1,1,1,0,1},
  42. {1,0,1,1,0}};
  43. g.n=5;g.e=16;
  44. for (i=0;i<g.n;i++)
  45. for (j=0;j<g.n;j++)
  46. g.edges[i][j]=A[i][j];
  47. G=(ALGraph *)malloc(sizeof(ALGraph));
  48. MatToList(g,G);
  49. printf(" 邻接表:\n");DispAdj(G);
  50. printf("广度优先序列:");BFS(G,2);printf("\n");
  51. }

发表评论

表情:
评论列表 (有 0 条评论,111人围观)

还没有评论,来说两句吧...

相关阅读