Bellman-Ford算法示例

#include <stdio.h>
int main()
{
    int dis[10],n,m,u[10],v[10],w[10];
    int inf=99999999;
    scanf("%d %d",&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;//初始化点1到自己的距离为0

    for(int k=1; k<=n-1; k++)//Bellman核心算法语句,最多运行n-1次
    {
        int check=0;
        for(int i=1; i<=m; i++)
        {
            if(dis[v[i]] > dis[u[i]]+w[i])
            {
                dis[v[i]] = dis[u[i]]+w[i];
                check = 1;
            }
        }
        if(check == 0)  break;//由于最多运行n-1次,所以一旦全部松弛完毕就直接跳出
    }

    for(int i=1; i<=n; i++)
        printf("%d ",dis[i]);

    return 0;
}

input:

5 5
2 3 2
1 2 -3
1 5 5
4 5 2
3 4 3

output:

0 -3 -1 2 4
  • 需要松弛4轮,每轮松弛结果为:
    1. 0 -3 ∞ ∞ 5
    2. 0 -3 -1 2 5
    3. 0 -3 -1 2 4
    4. 0 -3 -1 2 4
  • 简单解析:
    Bellman-Ford核心算法语句非常简单,最多松弛n-1轮,即有可能在n-1轮之前已经松弛完毕,所以加入check变量判断是否松弛完毕,以便减少时间
  • Bellman-Ford算法适用于解决负权边的问题
  • 可以检测一个图是否含有负权回路,如果n-1次松弛完毕后再运行,依然可以松弛,表明这个图含有负权回路
    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/qq_29630271/article/details/65437135
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞