Bellman-Ford算法(有向图)

#include <iostream>
#include <cstring>
#include <cstdio>

#define MAX 100
#define INF 0x3f3f3f
using namespace std;
//有向图
struct Edge
{
    int u,v,cost;
}e[MAX];
int dist[MAX];  //最短路径
int prev[MAX];  //路径
int m,n;    //边数和顶点数

bool Bellman_Ford(int v0)
{
    int u=v0;
    for(int i=1;i<=n;i++)
        dist[i]=INF;
    dist[u]=0;
    for(int i=1;i<=n;i++)
        for(int j=0;j<m;j++)
            if(dist[e[j].v]>dist[e[j].u]+e[j].cost)
            {
                dist[e[j].v]=dist[e[j].u]+e[j].cost;
                prev[e[j].v]=e[j].u;
            }
    for(int i=0;i<m;i++)
        if(dist[e[i].v]>dist[e[i].u]+e[i].cost)
            return 0;
    return 1;
}

int main()
{
    cin>>n>>m;
    for(int i=0;i<m;i++)
        cin>>e[i].u>>e[i].v>>e[i].cost;
    if(Bellman_Ford(1))
        for(int i = 1; i <= n; ++i) //每个点最短路
        {
            printf("%d
", dist[i]);
        }
    else
        printf("have negative circle
");
    return 0;
}
原文地址:https://www.cnblogs.com/asuml/p/6641473.html