算法与数据结构 --- 图 --- 图的遍历

第一部分 --- 深度优先搜索遍历思想(DFS)

为了避免顶点被重复访问,我们给每一个被访问过的顶点打上标记(打上标记的方法就是使用辅助数组,如上)

深度优先搜索可以理解为一条道走到黑

1.深度优先遍历:一条道走到黑,走完之后回退看看有没有别的路可走,如果有的话继续走,直到所有的路都被走完为止

1.深度优先遍历的顺序有很多种,到底是那一种遍历顺序则取决于我们选择了那些邻接点

2.从V1遍历到V5后我们发现没有V5的邻接点给我们遍历了,于是我们就开始了回退,回退到V4发现还是没有,继续回退到V3,V2...一直到V1发现有邻接点给我们遍历,我们就继续遍历,就这样直到将图中所有的顶点都遍历一遍为止

1.用邻接矩阵来实现深度优先遍历的时候,除了需要准备图的邻接矩阵外我们还需要准备一个辅助数组来标记图中的顶点是否被遍历(辅助数组的大小等于图中顶点的个数,然后数组中的每一个元素都对应着一个顶点)

2.整个的遍历过程是:

一.选择一个顶点作为遍历起点(一个顶点作为遍历起点后就会被遍历,所以我们需要将这个顶点在辅助数组中标记为被访问(一般数组中顶点对应位置存放1的时候为顶点被访问过,为0的时候则是没被访问))

二.在邻接矩阵中找到起始顶点所在的行,选择任意一个与顶点具有边关系(邻接关系)的点进行遍历(选择了顶点后,也要将被选择的顶点在辅助数组中的对应位置的元素由0改为1)

三.以被选择的顶点作为新的起点重复第二步(深度优先搜索

四.在执行第三步的时候如果被选择的顶点已经没有了没被访问过的邻接顶点的话(通过辅助数组来判断),我们就进行顶点回退,回退被选择的顶点的上一个顶点看看他有没有没被访问过的邻接顶点,如果没有继续回退(回退的终止条件是辅助数组中的所有元素都为1),如果有的话就执行第三步

我去用递归表示真的简洁啊,一个递归就同时包含了前进和回退

如果有没被访问过的邻接结点,那就一直前进访问去到下一层递归,如果没有没被访问过的邻接结点的话则这一层递归结束,回到上一层(此时就相当于在执行回退操作),回退之后继续循环找找有没有没被访问的邻接顶点,如果没有则这一层递归也结束,继续回退,如果有的话就前进访问,进入到下一层递归中,就这样不停的前进和回退,直到辅助数组中的所有元素都为1(图中所有顶点都被访问过)为止

 

非连通图的深度优先遍历方式就是:一个连通分量遍历完后,再遍历另一个连通分量,直到将所有的连通分量都遍历完为止


第二部分 --- 广度优先搜索思想(BFS)

1.被遮住的部分是邻接结点

1.非连通图的广度优先遍历方式是:先遍历一个连通分量,然后遍历另一个连通分量,直到将非连通图中的所有连通分量都遍历完为止

1.广度优先搜索的实现方式是邻接表 + 队列 + 辅助数组,实现步骤如下:

1.准备好图的邻接表,辅助数组(数组大小等于图中的顶点个数,数组中的元素对应着图中的每一个顶点,元素为1时,顶点被访问,元素为0时,顶点未被访问 --- 辅助数组在创建好后,里面的元素全部都初始化为0)

2.准备好一个队列,队列的大小为最多入队数

3.任选一个顶点,将这个顶点的下标入队,入队后将顶点在辅助数组中对应位置的元素由0改为1,此时称为第一层入队

4.结合这个顶点在表头数组中的对应位置的下标以及邻接表,找到数据域中存放有和顶点具有边关系的,没被访问过的邻接顶点在表头数组中的对应位置的下标的表结点,然后将表结点存放的下标依次入队,入队时将下标对应的顶点在辅助数组中的对应元素由0改为1,入队后将第一层的顶点出队(即我们选择的遍历起点)

此时称为第二层入队

5.按照入队的顺序和4中的方法依次将每个下标对应的,没被访问过的顶点的邻接顶点的下标入队(入队的同时记得将辅助数组中的对应元素由0改为1),入队完后将上一层入队的顶点下标依次出队,并继续重复第5步,直到辅助数组中所有元素都为1时停止。

1.队列为空的时候就代表所有元素都被遍历完了

2.算法中的思想就是出队一个顶点下标后,将这个顶点的所有没被访问过的邻接顶点的下标入队,入队完后继续出队一个顶点下标,并不断重复这一步直到队列为空(即所有元素都被访问过)为止

1.n是顶点个数

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值