Bellman-Ford算法示例

来源:互联网 发布:重庆大学网络服务中心 编辑:程序博客网 时间:2024/04/29 14:04
#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 52 3 21 2 -31 5 54 5 23 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次松弛完毕后再运行,依然可以松弛,表明这个图含有负权回路
0 0
原创粉丝点击