Bellman-Ford算法

贝尔曼福特算法求单源最短路,主要是对每条边进行n-1次松弛操作,找到最短路

判断图中是否存在从源点可达的负权路:
遍历图中所有的边(eg(u,v)),若存在dis[v]>dis[u]+w(u,v)的情况,则存在权为负的回路。
#include
#include
#define inf 1<<28

int dis[200];

struct node
{
    int u,v,w;
}eg[22000];

void BF(int s,int t,int n,int m)
{
    int i,j,flag;

    //初始化
    for(i=0;i<=n;i++)
        dis[i]=inf;
    dis[s]=0;

    for(i=1;idis[eg[j].u]+eg[j].w)
            {
                 dis[eg[j].v]=dis[eg[j].u]+eg[j].w;     //松弛操作
                 flag=1;        //松弛成功
            }

        }

         if(!flag)          //若没有松弛成功,跳出循环
            break;
    }

        printf("%d\n",dis[t]==inf?-1:dis[t]);

}

int main()
{
    int n,m,i,j;
    int a,b,c;

    while(scanf("%d%d",&n,&m),n||m)
    {
        int cont=0;
        for(i=0;i


 
  

也可以用贝尔曼福特算法求最长路,把所有边变为负值,dis数组初始化为负无穷,求最小的,然后再取其正值即为所求。


你可能感兴趣的:(数据结构之最短路)