图的遍历

  • 深度优先遍历:也有称为深度优先搜索,简称为\(DFS\)。深度优先遍历其实是一个递归的过程,就像是一棵树的前序遍历。从图中某个顶点\(v\)出发,访问此顶点,然后从\(v\)的未被访问的邻接点出发深度优先遍历图,直至图中所有和\(v\)有路径相通的顶点都被访问到。这里讲到的是连通图,对于非连通图,只需要对它的连通分量分别进行深度优先遍历,即在先前一个顶点进行一次深度优先遍历后,若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
    屏幕快照 2016-08-04 下午12.43.42.png

  • 广度优先遍历:又称为广度优先搜索,简称\(BFS\)。
    屏幕快照 2016-08-04 下午12.46.40.png
    屏幕快照 2016-08-04 下午12.52.02.png

图的遍历的代码

  • 邻接矩阵的深度遍历递归算法 屏幕快照 2016-08-10 下午9.06.10.png
  • 邻接表的深度遍历递归算法 屏幕快照 2016-08-10 下午9.08.07.png
  • 邻接表的深度遍历非递归算法
    下面这个算法是错误的,正确的算法见王道,或者再使用一个辅助栈,每次访问将边表先入辅助栈,然后再依次出栈入主栈
    屏幕快照 2016-08-10 下午10.27.35.png
    由于每个顶点表和边节点都要扫描一次,所以\(DFS\)算法的时间复杂度为\(O(n+e)\)

  • 邻接矩阵的广度优先遍历
    屏幕快照 2016-08-10 下午9.09.41.png
    屏幕快照 2016-08-10 下午9.11.30.png

  • 邻接表的广度优先遍历
    屏幕快照 2016-08-10 下午9.12.19.png
    屏幕快照 2016-08-10 下午9.12.33.png
    由于每个顶点表和边节点都要扫描一次,所以\(BFS\)算法的时间复杂度为\(O(n+e)\)

  • 假设一个无向图是非连通的,采用邻接表作为存储结构,试设计一个算法输出图中各连通分量的节点序列
    屏幕快照 2016-08-11 上午8.52.43.png

  • 假设\(G\)采用邻接表存储,试设计一个算法,判断无向图的\(G\)是一棵树,若是树返回\(1\),否则返回\(0\)。
    屏幕快照 2016-08-11 上午9.18.29.png
    无向图是树的条件为:无回路的连通图或者是有\(n-1\)条边的连通图

  • 假设一个有向连通图采用邻接表作为存储结构,试设计一个算法判断其中是否存在回路
    屏幕快照 2016-08-11 上午9.24.55.png
    采用深度优先遍历的方式,从顶点\(v\)出发,对每个访问过的节点\(w\)做标志\((visited[w]=1)\),若顶点\(w\)和顶点\(i\)均已经访问过,表示从\(w\)到\(i\)有一条路径,当从顶点\(i\)出发到达顶点\(w\)时,表示存在回路。「\(has的初始值为false\)」

  • 假设一个不带权值的无向图采用邻接表作为存储结构,求距离顶点\(v\)的最远的一个顶点。
    屏幕快照 2016-08-11 下午7.03.07.png

  • 假设不带权值的图\(G\)采用邻接表存储,设计算法判断从顶点\(u\)到顶点\(v\)之间是否有路径。
    屏幕快照 2016-08-11 下午7.41.36.png

  • 假设图采用邻接表存储,试设计一个算法,输出图\(G\)中从顶点\(u\)到\(v\)的所有简单路径。
    屏幕快照 2016-08-11 下午10.22.58.png

posted @ 2017-04-17 22:44  I呆呆  阅读(363)  评论(0编辑  收藏  举报