图的深度遍历和广度遍历算法
图的深度遍历可以简单理解为一条道走到黑,首先访问图中任一起始顶点v,再访问与v顶点邻接且未被访问过的顶点w1,再访问与w1邻接且未被访问过的顶点w2,重复上述操作,若不能继续向下访问时,则回退,直到所有的顶点被访问完。
具体实现算法用到了递归。需要借助一个visited数组,对已访问过的顶点做标记。
图的广度便利类似于树的层次遍历,一层一层的向外访问。首先从定顶点v出发,接着访问v所有的未被访问过的邻接顶点w1,w2,w3…然后再以此访问w1,w2,w3这些顶点的未被访问过的邻接顶点,直到所有的顶点都被访问。需要一个辅助的循环队列。当队列不为空时,就出队对头的元素(顶点),并依次访问该顶点未被访问过的邻接顶点,然后将他们依次入队。直到该循环队列为空。
关于深度便利和广度遍历的算法比较:
它们的空间复杂度都相同,都是O(n),最差的情况图中所有的顶点都要入队或入栈(递归情况下系统会自动使栈)。
时间复杂度只与存储结构(邻接矩阵or邻接表)有关,与搜索路径无关。邻接矩阵为O(n^2),需要查找n*n的矩阵;邻接表为O (n+e),n个头结点,再根据弧查找e个边节点。