基于邻接矩阵的Bellman-Ford和基于FIFO队列的Bellman-Ford算法

//有负权的图的最短路

//如果存在最短路就一定存在一条不含圈的最短路,最短路最多经过n-1个节点,通过松弛n-1轮得到

//BellmanFord 算法包含了Dijkstra算法

//基于邻接矩阵的Bellman-Ford算法

//基于FIFO队列的Bellman-Ford算法

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cmath>

#include<algorithm>

using namespace std;

const int maxn=10000;

int f[maxn],t[maxn],w[maxn],d[maxn];

int n,m,bg,ed;

void BellmanFord(){

    for(int i=0;i<n;i++)

        i==bg?d[i]=0:d[i]=0x3f3f3f3f;

    for(int i=0;i<n-1;i++){

        for(int j=0;j<m;j++){

            int x=f[i],y=t[i];

            if(d[x]<0x3f3f3f3f)

                if(d[y]>d[x]+w[i])

                    d[y]=d[x]+w[i];

        }

    }

}

int main(){

    cout<<“n m bg ed”<<endl;

    cin>>n>>m>>bg>>ed;

    cout<<“Edge”<<endl;

    for(int i=0;i<m;i++){

        cin>>f[i]>>t[i]>>w[i];

    }

    BellmanFord();

    for(int i=0;i<n;i++)printf(“%d “,d[i]);

    return 0;

}

//发现负圈时退出

#include<iostream>
#include<vector>
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=10000;
struct Edge{
    int f,e,l;
};
vector<Edge> edge;
int d[maxn],v[maxn],cnt[maxn];
vector<int> G[maxn];
int n,m,bg,ed;

int BellmanFord(){
    for(int i=0;i<n;i++)
        i==bg?d[i]=0:d[i]=0x3f3f3f3f;
    memset(cnt,0,sizeof(cnt));
    memset(v,0,sizeof(v));
    queue<int> que;
    v[bg]=1;
    que.push(bg);
    while(que.size()){
        int u=que.front();que.pop();
        v[u]=0;
        for(int i=0;i<G[u].size();i++){
            Edge& e=edge[G[u][i]];
            if(d[u]<0x3f3f3f3f&&d[e.e]>d[u]+e.l){
                d[e.e]=d[u]+e.l;
                if(!v[e.e]){
                    que.push(e.e);
                    v[e.e]=1;
                    if(++cnt[e.e]>n)return 0;
                }
            }
        }
    }
    return 1;
}
int main(){
    cout<<“n m bg ed”<<endl;
    cin>>n>>m>>bg>>ed;
    cout<<“The edges”<<endl;
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        edge.push_back(Edge{a,b,c});
        G[a].push_back(edge.size()-1);
    }
    BellmanFord();
    for(int i=0;i<n;i++)printf(“%d “,d[i]);
    return 0;
}

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/qq_33785671/article/details/52827236
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞