单源最短路 bellman_ford算法(模板)

/*
单源最短路bellman_ford算法,复杂度O(VE)
可以处理负边权图。
可以判断是否存在负环回路。返回true,当且仅当图中不包含从源点可达的负权回路
vector<Edge> E;先E.clear()初始化,然后加入所有边
点的编号从1开始(从0开始简单修改就可以了)
*/
#include<iostream>
#include<cstdio>
#include<vector>
#include<fstream>
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=550;
int dist[MAXN];

struct Edge
{
    int u,v;
    int cost;
    Edge(int _u=0,int _v=0,int _cost=0):u(_u),v(_v),cost(_cost){}
};

vector<Edge> E;

bool bellman_ford(int start,int n)//点的编号从1开始
{
    for(int i=1;i<=n;i++) dist[i]=INF;
    dist[start]=0;
    for(int i=1;i<n;i++)
    {
        bool flag=false;
        for(int j=0;j<E.size();j++)
        {
            int u=E[j].u;
            int v=E[j].v;
            int cost=E[j].cost;
            if(dist[v]>dist[u]+cost)
            {
                dist[v]=dist[u]+cost;
                flag=true;
            }
        }
        if(!flag) return true;//没有负环回路
    }
    for(int j=0;j<E.size();j++)
        if(dist[E[j].v]>dist[E[j].u]+E[j].cost)
            return false;//有负环回路
    return true;//没有负环回路
}

int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    int e;
    cin>>n>>e;
    if(!E.empty()) E.clear();
    //for(int i=1;i<=MAXN;i++) dist[i]=INF;
    int u,v,c;
    for(int i=0;i<e;i++)
    {
        int u,v,c;
        cin>>u>>v>>c;
        E.push_back(Edge(u,v,c));
    }
    bool mark=bellman_ford(1,n);
    if(mark)
    {
        cout<<"no negative circle"<<endl;
        for(int i=1;i<=n;i++)
            cout<<dist[i]<<" ";
        cout<<endl;
    }
    else cout<<"have negative circle"<<endl;
    return 0;
}

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