图的深度优先遍历和广度优先遍历

来源:互联网 发布:淘宝手机下单减价 编辑:程序博客网 时间:2024/06/05 10:35

广度优先遍历(BFS)

(1)从某个顶点V出发,访问该顶点的所有邻接点V1,V2..VN

(2)从邻接点V1,V2...VN出发,再访问他们各自的所有邻接点

(3)重复上述步骤,直到所有的顶点都被访问过


(1)从顶点V1出发,v1入队,访问V1,V1的邻接点有V2     V3     V4,将它们入队,v1出队

队列:V2   V3  V4

(2)访问队头V2,V2的邻接点为V1(已访问过,忽略)和V5,将V5入队,V2出队

队列:V3  V4  V5

(3)访问V3,V3的邻接点为V1(访问过忽略)   V4(已在队列忽略)  V6   V5(已在队列,忽略),V6入队,V3出队

队列:V4 V5  V6

......

/* 邻接矩阵的广度遍历算法 */  void BFSTraverse(MGraph G)  {      int i, j;      Queue Q;      for(i = 0; i < G.numVertexes; i++)          visited[i] = FALSE;          InitQueue(&Q);      /* 初始化一辅助用的队列 */          for(i = 0; i < G.numVertexes; i++)  /* 对每一个顶点做循环 */          {          if (!visited[i])    /* 若是未访问过就处理 */          {              visited[i]=TRUE;        /* 设置当前顶点访问过 */              printf("%c ", G.vexs[i]);/* 打印顶点,也可以其它操作 */              EnQueue(&Q,i);      /* 将此顶点入队列 */              while(!QueueEmpty(Q))   /* 若当前队列不为空 */              {                  DeQueue(&Q,&i); /* 将队对元素出队列,赋值给i */                  for(j=0;j<G.numVertexes;j++)                   {                       /* 判断其它顶点若与当前顶点存在边且未访问过  */                      if(G.arc[i][j] == 1 && !visited[j])                       {                           visited[j]=TRUE;            /* 将找到的此顶点标记为已访问 */                          printf("%c ", G.vexs[j]);   /* 打印顶点 */                          EnQueue(&Q,j);              /* 将找到的此顶点入队列  */                      }                   }               }          }      }  }  

深度遍历后续更新
转载自:http://blog.csdn.net/lom9357bye/article/details/46604657

原创粉丝点击