最短路径
1.路径是有向的
2.权重不一定等价于距离
3.并不是所有顶点都是可达的
4.负权值会使问题更加复杂(下面不考虑负的)
两点之间,权值最小的路径。
Dijkstra算法
是一种单源(指定一个出发顶点)最短路径,针对的是非负权边。
以A为出发点
我们设置3个数组,第一个S数组,存放已选路径的顶点。第二个V,存放剩下的顶点。第三个dist,存放起始点A与V数组对应的顶点的最小权值。(-1表示两个顶点无连接,无穷);
以A为顶点,这3个数组是这样的。S放选中的,V是剩下的。初始化dist都为-1。
1.遍历A与V中顶点得到,A->C=3,A->B=6。选择A->C。将C从V数组移除,加到S中。根据遍历到的值,更新dist数组
2.遍历C与V中顶点。A->C->B=3+2 =5,A->C->D=3+9=6 , A->C->E=3+4=7 . 接下来选择B。将B从V数组移除,加到S中。根据遍历到的值,更新dist
3.最后只剩下F,将F加入集合。最后的dist数组,就是表示A点到其他各个顶点的最短路径
Bellman-Ford算法
解决:存在负权边的情况
无环加权有向图中的最短路径算法
特点:线性时间内解决单点最短路径,,可以处理权值是负的情况,,能找出最长路径
缺点:因为是基于拓扑排序,无法解决带环问题
1.对有向无环图进行拓扑排序
2.将到源,的距离初始化为0,其他顶点为无穷大
3.对于列表的每一个顶点,我们从它的所有邻节点中找到最短路径的顶点。