找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4045|回复: 0

图的深度优先搜索(邻接表)

[复制链接]
发表于 2012-2-11 19:51:03 | 显示全部楼层 |阅读模式

图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。

深度优先搜索(Depth First Search)

        深度优先搜索假设初始状态下图中所有顶点都未被访问,尝试优先搜索从图中某个顶点v出去,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直到图中所有和v相连连的顶点都被访问到。如果此时图中还有没有访问到的顶点,则另选图中未被访问的某顶点作为起始点,重复上述过程,直到图中所有顶点都被访问到。

采用邻接表存储图的具体实现如下:#include <cstdio>

  1. #include <cstdlib>
  2. #define VERTEXNUM 100 //顶点个数
  3. typedef char VertexType;
  4. typedef int EdgeType;
  5. typedef enum{FALSE, TRUE} Boolean;
  6. Boolean visited[VERTEXNUM];
  7. /***************************************
  8. *
  9. * 邻接表存储结构
  10. *
  11. * *************************************/
  12. typedef struct node
  13. {
  14.         int adjvex; //顶点位置
  15.         struct node *next; //指向下一条边的指针
  16. }EdgeNode;
  17. typedef struct vnode
  18. {
  19.         VertexType vertex; //顶点信息
  20.         EdgeNode *firstedge; //指向第一条依附该顶点的边的指针
  21. }AdjList[VERTEXNUM];
  22. typedef struct
  23. {
  24.         AdjList vertexs; //邻接表
  25.         int vernum, edgenum; //图中当前的顶点和边数
  26. }Graph;
  27. /***************************************
  28. *
  29. * 建立图的邻接表
  30. *
  31. * *************************************/
  32. void MakeGraph(Graph *graph)
  33. {
  34.         int v1, v2;
  35.         int i, j, k;
  36.         printf("请输入图的顶点数n和边数e:\n");
  37.         scanf("%d%d", &graph->vernum, &graph->edgenum);
  38.         printf("请输入顶点信息(顶点号<CR>)每个顶点以回车作为结束:\n");
  39.         for(i = 0; i < graph->vernum; i++)
  40.         {
  41.                 getchar();
  42.                 scanf("%c", &graph->vertexs[i].vertex);
  43.                 graph->vertexs[i].firstedge = NULL; //初始第一条边为空
  44.         }
  45.         printf("请输入每条边对应的两个顶点的序号(格式为i,j):\n");
  46.         EdgeNode *p;
  47.         for(k = 0; k < graph->edgenum; k++)
  48.         {
  49.                 scanf("%d,%d", &i, &j);  //读入边<vi,vj>的序号
  50.                 p = (node *)malloc(sizeof(node)); //生成新的结点
  51.                 p->adjvex = j - 1;
  52.                 p->next = graph->vertexs[i - 1].firstedge;
  53.                 graph->vertexs[i - 1].firstedge = p;
  54.         }
  55. }
  56. /***************************************
  57. *
  58. * 深度优先遍历
  59. *
  60. * *************************************/
  61. void DFSTraverse(Graph *graph, int v)
  62. {
  63.         visited[v] = TRUE;
  64.         printf("深度遍历:结点%c\n", graph->vertexs[v].vertex);
  65.         EdgeNode *p = graph->vertexs[v].firstedge;
  66.         while(p != NULL)
  67.         {
  68.                 if(!visited[p->adjvex])
  69.                         DFSTraverse(graph, p->adjvex);
  70.                 p = p->next;
  71.         }
  72. }
  73. void DFS(Graph *graph)
  74. {
  75.         int i;
  76.         for(i = 0; i < graph->vernum; i++)
  77.                 visited[i] = FALSE;
  78.         for(i = 0; i < graph->vernum; i++)
  79.                 if(!visited[i])
  80.                         DFSTraverse(graph, i);
  81. }
  82. int main()
  83. {
  84.         Graph *graph = (Graph *)malloc(sizeof(Graph));
  85.         MakeGraph(graph); //建立图的邻接表
  86.         DFS(graph); //深度优先遍历
  87.         return 0;
  88. }
复制代码

对于图一中的图,上述程序运行结果如图二。


图一


您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 18:52 , Processed in 0.012968 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表