zoukankan      html  css  js  c++  java
  • 图-图的遍历

    广度优先遍历(BFS)

    • 过程分析
      • 初始化一个队列。访问A顶点,将A顶点入队,之后出队。同时将与A顶点相邻接的顶点B,F入队
      • 访问B结点,将B结点出队,同时将与B结点相邻接,且还未被访问过的顶点C,I,G入队

      • 访问F结点,将F结点出队,同时将于F结点相邻接,且还未被访问过的顶点G,E入队。之后同理,直到队列为空。所得的出队序列就是遍历序列
    • BFS代码
      •  1 bool visited[MaxVertexNum];        //访问标记数组
         2 //邻接矩阵的广度遍历算法
         3 void BFSTraverse(MGraph G)
         4 {
         5     Queue Q;    //辅助队列
         6     for (int i = 0; i < G.vexnum; i++)
         7     {
         8         visited[i] = false;    //访问标记数组初始化
         9     }
        10     InitQueue(Q);    //初始化辅助队列
        11     for (int i = 0; i < G.vexnum; i++)    //从0号顶点开始遍历
        12         if (!visited[i])    //对每个连通分量调用一次BFS
        13             BFS(G, i);    //Vi未访问过,从Vi开始BFS
        14 }
        15 
        16 void BFS(MGraph G, int v)
        17 {
        18     //从顶点v出发,广度优先遍历图G,算法借助一个辅助队列Q
        19     visit(v);    //访问结点v
        20     visited[v] = true;    //对v做访问标记
        21     Enqueue(Q, v);        //顶点v入队列
        22     while (!isEmpty(Q))
        23     {
        24         Dequeue(Q, v);        //顶点v出队
        25         for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))//检测v所有的邻接点
        26         {
        27             if (!visited[w])    //w为v还未访问过的邻接结点
        28             {
        29                 visit(w);    //访问顶点w
        30                 visited[w] = true;    //对顶点w做访问标记
        31                 Enqueue(Q, w);        //将顶点w入队
        32             }
        33         }
        34     }
        35 }

    深度优先遍历(DFS)

    • 过程分析:首先访问图中某一起始顶点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,....重复上述过程。当不能再继续访问的时候,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该顶点开始继续上述搜索过程,直到图中所有顶点均被访问过为止。
    • DFS代码
      •  1 /*深度优先遍历算法*/
         2 bool visited[MaxVertexNum];        //访问标记数组
         3 void DFSTraverse(MGraph G)
         4 {
         5     for (int v = 0; v < G.vexnum; ++v)
         6         visited[v] = false;        //初始化访问标记数组
         7     for (int v = 0; v < G.vexnum; ++v)    //从顶点0开始遍历
         8     {
         9         if (!visited[v])        //顶点v还问访问过,则访问
        10             DFS(G, v);
        11     }
        12 }
        13 
        14 void DFS(MGraph G, int v)
        15 {
        16     //从顶点v出发,采用递归思想,深度优先遍历图
        17     visit(v);
        18     visited[v] = true;
        19     for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))//检测v所有的邻接点
        20         if (!visited[w])
        21         {
        22             DFS(G, w);
        23         }
        24 }
  • 相关阅读:
    OO开发
    重构:Extract Method (提炼函数)
    Vue 一个组件引用另一个组件
    闭包
    视差滚动原理与实现
    JS中的constructor 和 prototype
    jQuery 为动态添加的元素绑定事件
    setTimeout 的理解
    关于Vertical Align的理解
    网页特效:滚动视差设计指南
  • 原文地址:https://www.cnblogs.com/KBryant/p/11617232.html
Copyright © 2011-2022 走看看