zoukankan      html  css  js  c++  java
  • 图的遍历深度遍历和广度遍历

    图的深度遍历(类似于树的先跟遍历)

    设初始状态图中所有的结点都没有遍历过。

    深度遍历可以从某个顶点v出发,访问v顶点,然后依次从v的未访问的邻接顶点出发深度遍历图,直到图中所有和v有路径相通的顶点都被访问过。

    伪代码如下:(运用的是邻接表存储)

    DFS(Graph G,int v)
     1 void DFS(Graph G ,int v){
    2
    3 visited[v]=true;VisitFunction(v);
    4
    5 for(w = FirstAdjVex(G,v);w;w=NextAdjVex(G,v,w)){
    6
    7 if(!visited[w]) DFS(G,w);
    8
    9 }
    10
    11 }

    在推广下,上面的深度遍历是建立在所给的图为连通图,如果所给的图不连通,那么算法得加上下面的代码:

    View Code
    1 for(v=0;v<G.vexnum;v++){
    2
    3 if(!visited[v]) DFS(G,v);
    4
    5 }

    也就是说只要将每个没有被访问的顶点都进行一次深度遍历即可。

    ----------------------------------------------------------------我是分割线----------------------------------------------------------------------------------------------

    图的广度遍历(类似于树的层次遍历)

    同样设初始状态图中所有的结点都没有遍历过

    由于同树的层次遍历类似因此需要一个队列来保存跟的所有孩子。

    算法如下:

    假设从图中的某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发访问他们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至所有顶点都被访问。

    换句话说 广度优先遍历的过程是:以v为起始点,由近到远,依次访问和v由路径相连通且路径长度为1,2,.....的顶点。

    伪代码如下:(运用的是邻接表存储)

    BFS(Graph G,int v)
     1 void BFS(Graph G,int v){
    2
    3/*初始化visited数组*/
    4
    5 ​ EnQueue(Q,v);
    6
    7while(!QueueEmpty()){
    8
    9 ​ ​ DeQueue(Q,u);
    10
    11 ​ ​ visited[u]=true; VisitFunction(u);
    12
    13 ​ ​ //将u结点的所有没有被访问的邻接点都进队列
    14
    15 ​ ​ for(w = FirstAdjVex(G,v);w;w=NextAdjVex(G,v,w)){
    16
    17 ​ ​ ​ if(!visited[w]) EnQueue(w);
    18
    19 ​ ​ }
    20
    21 ​ }
    22
    23 }

    同理上面只针对连通图,对于非连通图要加上下面的代码

    View Code
    1 for(v=0;v<G.vexnum;v++){
    2
    3if(!visited[v]) BFS(G,v);
    4
    5 }

  • 相关阅读:
    appium webview切换native界面操作方法
    Appium 常见操作元素
    Appium 常见API 一
    adb shell dumpsys获取设备的当前app的waitActivity
    xpath定位
    python-1.列表、元组操作 2.字符串操作 3.字典操作 4.集合操作 5. 文件操作 6.字符编码与转码 7.内置函数
    python-简单的登陆接口
    python-变量、if else语句 、for循环、while循环(4月26号)
    【2-1】非线性回归
    【1-1】创建图、启动图、变量
  • 原文地址:https://www.cnblogs.com/hankskfc/p/2192843.html
Copyright © 2011-2022 走看看