Bellman-Ford -解决负权边

Dijkstra 算法终于理解,但是不能有负权边,

让我们看看BellmanFord 核心代码:

for(k=1;k<=n-1;k++)
    for(i=1;i<=m;i++)
        if(dis[v[i]] > dis[u[i]] + w[i])
        dis[v[i]] = dis[u[i]] + w[i];

上面的代码中,外循环一共循环乐n-1次,内循环循环了m次,。
第i条边存储在u[i],v[i],w[i];表示从顶点u[i] 到v[i]这条边。

#include <stdio.h>

int main()
{
    int dis[10],bak[10],i,k,n,m,u[10],v[10],w[10],check,flag;
    int inf=99999999; //终于知道inf 是infinity的缩写

    scanf("%d %d",&n,&m);//老规矩;n 为顶点,m为边数

    for(int i=1;i<=m;i++)
        scanf("%d %d %d",&u[i],&v[i],&w[i]);

    for(int i=1;i<=n;i++)
        dis[i] = inf;
    dis[1] = 0;


    //Bellman-ford算法核心语句
    for(int k=1;k<=n-1;k++)
    {
        for(i=1;i<=n;i++)
            bak[i] =dis[i];
        for(i=1;i<=m;i++)
            if(dis[v[i]] > dis[u[i]] + w[i])
            dis[v[i]] = dis[u[i]] +w[i];

        //松弛完毕后检测dis数组是否有更新
        check =0;
        for(int i=1;i<=n;i++)
            if(bak[i] != dis[i])
        {
            check=1;
            break;
        }
    }

    //检测负权回路
    flag = 0;
    for(int i=1;i<=m;i++)
        if(dis[v[i]] > dis[u[i]]+w[i])
        flag = 1;

    if(flag == 1)
        printf("有回路")
    else
    {
        for(i=1;i<=n;i++)
            printf("%d",dis[i]);
    }
    return 0;
}

优化:当没有更新时候就可以停止了。

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