对于BF算法,我们主要是用于解决Dijkstra算法不能解决的问题,我们之前说到,Dijkstra算法的使用范围是结点之间的边权为正数的情况。所以BF算法可以解决边权为负的情况。
我们考虑环的问题,我们可以知道,如果某个点经过一系列的点后回到自身后,如果边权之和为正的话,则称为正环,为0则为零环,为负则为负环。对于正环和零环的情况,我们可以知道不会影响最短路径的取值,但是如果出现负环,我们的算法就很可能受到影响。但是,因为我们考虑的是有向图的情况,如果我们从源点出发不能通过该负环到达我们要源点自身,那么最短路径的求法还是不会受到影响的。
下面这种的是Bellman—Ford算法,其实这种的和Dijkstra算法相比就是这个多了一个最外层的n-1次循环。
bool Bellman(int s){
fill(d,d+maxn,INF);
fill(num,num+maxn,0);
fill(w,w+maxn,0);
d[s]=0;
w[s]=weight[s];
num[s]=1;
for(int i=0;i<n-1;i++){
for(int u=0;u<n;u++){
for(int j=0;j<Adj[u].size();j++){
int v=Adj[u][j].v;
int dis=Adj[u][j].dis;
if(d[u]+dis<d[v]){
w[v]