最短路 bellman-ford算法详解与模板(可判负环)

Bellman-Ford算法适用于寻找含负权边的图中单源最短路径。虽然效率较低,为O(nm),但其通过n-1次松弛操作确保所有点的最短路径更新。如果在n-1次后仍能松弛,说明存在负环,导致无法找到最短路径。该算法与Dijkstra算法类似,但能处理负权重。当调用函数返回true时,表明图中存在负环。
摘要由CSDN通过智能技术生成

转载注明出处csdnbestsort

Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低(O(nm)),代码难度较小。其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成.

为什么是松弛n-1次?简单来说就是从源点到一个点的最短路最极限的一种情况的路径需要经过全部的点,也就是需要松弛v-1次,这样,我们执行v-1次就可以保证所有的点都松弛到最佳的情况,如果执行了v-1次后还能继续松弛,那就说明图中有负权环,无解.

bellman的松弛操作有点类似于Dijkstra算法,是对u->v以及u->k->v(k为中间值)取最小值,n-1次松弛后,dis数组中储存的即为要求点到各个点之间的最小值.

 

主代码如下:

const int maxn =  1e4;
const int INF = 0x3f3f3f3f;
const int inf = 0x3f;
int dis[maxn];
struct edge{
    int s,e;    ///起点,终点
    int w;      ///权值
}e[maxn];
int n,m;                //n为点,m为边的总数
bool bellman(int a,int n)     ///求a->其他点的最短路,n为结点总数.可判负环
{
    
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值