目录

算法BFS最短路径问题拓扑排序

【算法】BFS(最短路径问题、拓扑排序)

🌈个人主页:

🔥 系列专栏:

https://img-blog.csdnimg.cn/direct/9efbcbc3d25747719da38c01b3fa9b4f.gif

目录


前言

💬 hello! 各位铁子们大家好哇。

今日更新了最短路径问题和拓扑排序的相关内容

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

边权为1的最短路径问题

只要边权都是相同的,就可以看作是边权为1的最短路径问题。

https://i-blog.csdnimg.cn/direct/368be94cc68e462bb0f312dfdd2aabb2.png

上图中的数字就是权值,比如a和b之间的长度是3。最短路径问题就是从某个点到另外一个点的最短长度。最简单的最短路径问题,就是边权都为1的。

这里是一道例题: 题解在这:

多源BFS最短路问题

单源最短路问题就是只有一个起点和一个终点。

多源最短路问题是可以有多个起点和一个终点。

多源bfs:用bfs解决边权为1的多源最短路问题。

https://i-blog.csdnimg.cn/direct/333321a7d40740f38612614afdcdd6b3.png

如上图,解法:把所有的源点当成一个“超级源点”。问题就变成单一的单源最短路问题。

绿色是源点(起点)。

例题: 题解:

BFS解决拓扑排序

有向无环图(DAG图)

https://i-blog.csdnimg.cn/direct/dc81e24ac2544c64b328f6358d2d5c87.png

如上图,由顶点和有方向的边连接起来的图,就是有向图。 ”无环“是指不会形成回路。

https://i-blog.csdnimg.cn/direct/415e99fffeb04134bd0ea16ceb5c8801.png

如上图,4指向5,5指向6,6又指向4,形成了一个环,此时就是有环的。

https://i-blog.csdnimg.cn/direct/aa5adc4a9dd64596b3f78a120e0c11a9.png

对于顶点的概念:

入度: 有多少条边指向该顶点

出度:由该顶点出去有几条边。

如上图,绿色代表入度,红色代表出度。1的入度是0,因为没有边指向它。1的出度是2,因为有两条边指向外面。

AOV网:顶点活动图

在有向无环图中,用顶点来表示一个活动,用边来表示活动的先后顺序的结构。 https://i-blog.csdnimg.cn/direct/57a7344d24944b2c9b247849b9f763a4.png

如上方的青椒炒肉工程图就是一个AOV网。

拓扑排序

拓扑排序简单来说,就是找到做事情的先后顺序,并且结果可能不能唯一的。

https://i-blog.csdnimg.cn/direct/57a7344d24944b2c9b247849b9f763a4.png

在这个工程图中,有些活动必须得在某些活动完成后才能执行。

如何排序?

最开始只能选择准备厨具或者买菜,他们两个其实都是入度为0的点。因此,活动的执行顺序其实就是把入度为0的点拿出来,然后把该点连接的边都删除,让别的点的入度减少。

操作:

1.找出图中入度为0的点,然后输出。

2.删除与该点连接的边。

3.重复1,2操作,直到图中没有点或者 没有入度为0 的点为止。

为什么要加上没有入度为0的点为循环结束条件呢?

因为我们并不知道图中是否有环。

所以拓扑排序有一个重要应用:判断有向图中是否有环。

实现拓扑排序

借助队列,进行一次bfs即可。

1.初始化:把所有入度为0的点加入到队列中

2.当队列不为空时:

1.拿出队头元素,加入到最终结果中;

2.删除与该元素相连的边;

3.判断:与删除边相连的点,是否入度变为0。如果入度为0,就加入到队列中。

例题: 题解: