依旧采取静态数组邻接表 来构图, 这样使用非常方便, 只要在邻接表内的边都是存在的边, 而没有的边均是不通的边, 输入起来很方便, 使用时候也很方便.
Bellman变形得到的就是SPFA算法, 复杂度比bellman更低一些,比迪克拉斯算法适用范围更广,边权可以有负值, 但是不能带负环,否则绕着负环无限走下去,总能变得越来越小.
这些最短路算法都是使用了松弛原理, 只是松弛时又做了一些小变化.
SPFA : 初始化源点的d[]=0,其他的d[]=INF.
源点入队, 每次取队头出队列, 标记它不在队列内, 如果可以更新它所关联的端点, 并且端点不在队列内,则加入队列.
这样,每个端点都可能重复进入队列,但是经过有限次松弛, 总会使所有的端点的最短路径都无法再次更新. Dij算法区别于使用了
优先队列, 每次出队的结点已经完美,无需再次进入,而这里使用的是普通队列. Dij只允许正权图使用.
还有Floyd算法, 可以求任意两点间最短路径, O(n3)复杂度, 写起来很简单, 需要做一些初始化.
d[][]=INF。
然后修正以下内容:
d[i][i]=0,c[i][i]=1. 即自身可与自身连通,到自身路径是0.
d[i][j]=w[i][j]
然后可以使用算法了.