图的最短路径算法(四)--Bellman-Ford(解决负权边)单源点最短路径

原创 2016年08月29日 22:06:15
//含有负权边的单源点最短路径
//动态规划思想:两点之间的最短路径最多经过n-1边即可到达
//那么依次更新经过1条边,2条边,...,n-1条边的最短路径

#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;
    //读入n和m,n表示顶点个数,m表示边的条数
    scanf("%d %d",&n,&m);

    //读入边
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&u[i],&v[i],&w[i]);
    }

    //初始化dis数组,这里是1号顶点到其余各顶点的初始路程
    for(i=1;i<=n;i++)
        dis[i]=inf;
    dis[1]=0;

    //Bellman-Ford算法核心语句
    for(k=1;k<=n-1;k++)
    {
        //将dis数组备份到bak数组中
        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(i=1;i<=n;i++)
            if(bak[i]!=dis[i])
        {
            check=1;
            break;
        }
        if(check==0)
            break;    //数组没有更新,提前退出循环算法
    }
    //检测负权回路
    flag=0;
    for(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;
}

/*
5 5
2 3 2
1 2 -3
1 5 5
4 5 2
3 4 3
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

最短路径(三)—Bellman-Ford算法(解决负权边)

前两节我们写了Floyd-Warshall算法http://blog.csdn.net/wtyvhreal/article/details/43315705和 Dijkstra算法http://bl...
  • wtyvhreal
  • wtyvhreal
  • 2015年02月03日 15:45
  • 4047

Bellman-Ford算法---求包含负权边单源最短路径(动态规划)

单源最短路径:给定一个图,和一个源顶点src,找到从src到其它所有所有顶点的最短路径,图中可能含有负权值的边。 Dijksra的算法是一个贪婪算法,时间复杂度是O(VLogV)(使用最小堆)。但是...
  • will130
  • will130
  • 2015年06月04日 22:43
  • 1384

带负权图的单源最短路径算法:Bellman-Ford算法

前面介绍过图的单源最短路径算法Dijks
  • zhangyalin1992
  • zhangyalin1992
  • 2014年05月31日 16:58
  • 2093

多源有权图的最短路径 floyd算法(动态规划能解决负权边)7.1.3

核心代码只有5行呀 for(int k=0;kNv;k++) for(int i=0;iNv;i++) for(int j=0;jNv;j++) if...
  • qq_26046771
  • qq_26046771
  • 2017年04月25日 09:13
  • 217

最短路径问题--Bellman-Ford最短路径算法

Bellman-Ford最短路径算法
  • chaoshengmingyue
  • chaoshengmingyue
  • 2016年06月29日 13:30
  • 568

最短路径——具有负边值的图

为何Dijkstra算法不能算出具有负边值的图的最短路径?
  • kaitankedemao
  • kaitankedemao
  • 2014年05月26日 23:56
  • 1235

图算法 单源最短路径 Bellman_Ford算法(边权值为负情况)

一、前瞻   在之前的单源最短路径Dijkstra算法中,博主给出了最短路径的一些基本概念和问题,并且给出了对权值不能为负的图使用Dijkstra算法求解单源最短路径问题的方法。   我们提到,D...
  • tham_
  • tham_
  • 2015年05月27日 17:14
  • 1029

图之四(最短路径)

1.        最短路径 1.1.       最短路径: 是带权有向图中,一个顶点u到另一顶点v之间权值最小的路径,最短路径可能不止一条。 最短路径不能含有负权回路,否则在负权回路上循环则...
  • onyheart
  • onyheart
  • 2013年11月26日 23:38
  • 426

贪心算法之单源最短路径

问题:在一个有向网络中,从某点出发得到所有到该顶点的最短距离。 迪杰斯特拉算法是解单源最短路径问题的一个贪心算法,其基本思想是,设置顶点集合S不断的贪心选择来扩充这个集合。当源点到该顶点的最...
  • u014034497
  • u014034497
  • 2015年04月09日 15:42
  • 979

单源最短路径--贪心算法

一个点(源点)到其余各个顶点的最短路径。也叫做“单源最短路径”Dijkstra。 Dijkstra的主要思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路...
  • zhoufen12345
  • zhoufen12345
  • 2017年02月10日 10:45
  • 2031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图的最短路径算法(四)--Bellman-Ford(解决负权边)单源点最短路径
举报原因:
原因补充:

(最多只允许输入30个字)