与Dijkstra算法一样,我们定义一幅加权有向图的结构如下:
//带权有向图
struct EdgeWeightedDigraph
{
size_t V; //顶点数
size_t E; //边数
map<int, forward_list<tuple<int, int, double>> adj; //改进后的邻接表,tuple存储的是边集
}
Bellman-Ford算法
在加权有向图的最短路径求解算法中,Dijkstra算法只能处理所有边的权值都是非负的图(是否有环不影响求解),而基于拓扑顺序的算法虽然能在线性时间内高效处理负权重图,但仅局限于无环图。为此还需要一个更为普遍的最短路径求解算法:能够处理负权重图,也能处理有环的情况。
Bellman-Ford算法是求含负权重图的单源最短路径的一种算法。其原理为连续进行松弛,对于含有V个顶点的加权有向图,在每次松弛时把每条边都更新一下,若在V-1次松弛后还能更新,则说明图中有负权重环,因此无法得出结果,否则就完成。
vector<int> Bellman-Ford(EdgeWeightedDigraph &g)
{
vec