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 }

  • 相关阅读:
    机器学习学习笔记之二:决策树
    机器学习学习笔记之一:K最近邻算法(KNN)
    Shell脚本编程中的几个问题
    Linux服务器配置git服务
    Ubuntu下安装IDA pro
    网络扫描(二)
    网络扫描(一)
    Docker学习过程中遇到的问题及解决方法
    CentOS7中升级Docker版本
    解决CentOS无法解析域名的问题
  • 原文地址:https://www.cnblogs.com/hankskfc/p/2192843.html
Copyright © 2011-2022 走看看