图(图的存储和图的遍历即深度优先搜索遍历图和广度优先搜索遍历图)

一、图的数组(邻接矩阵)存储表示
定义 : 矩阵的元素为
二、图的邻接表
     存储表示
三:
图的遍历
 
从图中 某个顶点 出发游历图, 访遍 图中其余顶点 ,并且使图中的每个顶点 仅被访问一次 的过程。
遇到的问题:图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。
   为避免重复访问,可设一个标志顶点是否被访问过的辅助数组 visited [], 它的初始状态为0,在图遍历过程中,一旦某一个顶点 i 被访问,就立即让 visited [i] 为1,防止它被多次访问。
 
一、深度优先搜索遍历图
 
连通图的深度优先搜索遍历
 
从图中某个顶点 V 0 出发,访问此顶点,然 后选择一个 V 0 邻接且未被访问的顶点 W 初始顶点 , W 出发进行深度优先搜索 , 至图中所有顶点都被访问到。
 
深度优先搜索 DFS ( Depth First Search )
深度优先搜索的示例
深度优先搜索过程
深度优先生成树
DFS 在访问图中某一起始顶点v 后,由v 出发,访问它的任一邻接顶点w1;再从w1 出发,访问与w1邻接但还没有访问过的顶点w2;然后再从w2 出发,进行类似的访问,…如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u 为止。
接着,退回一步,退到前一次刚访问过的顶 ,看是否还有其它没有被访问的邻接顶点。 如果有,则访问此顶点,之后再从此顶点出 发,进行与前述类似的访问; 如果没有,就再退回一步进行搜索 。重复上述过程,直到连通 图中所有顶点都被访问过为止。
算法分析:
图中有n 个顶点,e 条边。
如果用邻接表表示图,沿 Firstout à link 链可 以找到某个顶点 v 的所有邻接顶点 w 。由于总 共有 2 e 个边结点,所以扫描边的时间为 O( e ) 而且对所有顶点递归访问 1 次,所以遍历图的时 间复杂性为 O( n + e )
如果用邻接矩阵表示图,则查找每一个顶点的 所有的边,所需时间为 O( n ) ,则遍历图中所有 的顶点所需的时间为 O( n 2 )
 
二、广度优先搜索遍历图
对连通图,从起始点 V 到其余各顶点必定存 在路径。  
其中, V->w 1 , V->w 2 , V->w 8  
                 的路径长度为 1
V->w 7 , V->w 3 , V->w 5
     路径长度为 2
V->w 6 , V->w 4  
  的路径长度为 3
从图中的某个顶点 V 出发,并在访问 V 0 之后 依次访问 V 0 的各个未被访问的邻接点 ,之后 按这些顶点被访问的 先后次序 依次访问它们 的邻接点 ,直至图中所有和 V 0 有路径相通的 顶点都被访问到。
若此时图中尚有顶点未被访问,则另选图中 一个未曾被访问的顶点作起始点,重复上述 过程,直至图中所有顶点都被访问到为止。
广度优先搜索 BFS ( Breadth First Search )
广度优先搜索的示例
广度优先搜索过程
 
广度优先生成树
 
使用广度优先搜索在访问了起始顶点v 之后,由v 出发,依次访问v 的各个未曾被访问过的邻接顶点w1, w2, …, wt,然后 再顺序访问 w 1 , w 2 , …, w t 的所有还未被访问过的邻接顶点 。再从这些访问过的顶点出发,再访问它们的所有还未被访问过的邻接点,…如此做下去,直到图中所有顶点都被访问到为止。
       广度优先搜索是一种 分层 的搜索过程, 每向前走一步可能访问一批顶点,不像深 度优先搜索那样有往回退的情况。因此, 广度优先搜索不是一个递归的过程,其算 法也不是递归的。
 
为了实现逐层访问,算法中使用了一个队列,以记忆正在访问的这一层和上一层的顶点,以便于向下一层访问。
    与深度优先搜索过程一样,为避免重复访问,需要一个辅助数组 visited [ ] ,给被访问过的顶点加标记。
算法分析 :
如果使用邻接表表示图,则循环的总时间代价为 d0 + d1 + … + dn-1 = O(e),其中的 di 是顶点i 的度。
如果使用邻接矩阵,则对于每一个被访问过的顶点,循环要检测矩阵中的n 个元素,总的时间代价为O(n2)。
三:
遍历算法总结
1. 遍历图的过程实质上是 通过边或弧找 邻接点的过程 ,因此 DFS BFS 的时间 复杂度是相同的。
2. 对于一个图,它的 DFS BFS 的搜索 顺序不唯一, 是由该图的存储结构决定 的。
3 、如果从无向图的任一顶点出发进行 一次 深度优先搜索即可访问所有顶点, 则该图一定是连通图。
4 、对于非连通图的遍历过程中每调用 一次 DFS 算法都得到该图的一个 连通分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值