Bellman-ford算法

当存在负权边的时候,最短路都不一定存在,比如说负环。

所以我们平时说的最短路一定是不含有环的,不管是dijkstra还是其他求最短路的问题,都是如此。

因为环存在三种情况,正环,负环和零环,而这三种环肯定不可能出现在最短路的路径中。如果存在这个肯定不能是最短路了(自己思考一下,很简单的)

排除了环,但是如果存在负边在图中,用dijkstra是不能求出最短路的(思考)。

所以当一个有负权边时就要用bellman-ford或者folyd求解了。

bellman-ford 算法 是一个典型的动态规划问题。

此算法为了避免环的影响,做一限制了源点到目标点得走得边数,即n 个顶点的图,最多走n-1路,所以最短路径是在 1到n-1 条边之内就能找到。 

则设dist[K][ V]  k 从1 到 n-1   V 为目标点。所以状态方程为:

dist[K][V] = min{ dist[K-1][V] + min{  dist[K-1][j] + map[j][v]     }     }

  K:  1->n-1       V: 1->n  但不包括源点。     j: 1->n   所以一种是三层循环  

下面是bellman-ford算法:

#define INF 1000000000
#define MAXN 8
int n;
int map[MAXN][MAXN];
int lowcost[MAXN];
void Bellman( int start )
{
	int i, j, k, u;
	for( i = 0; i < n; i++ )
		lowcost[i] = map[start][i];
	for( k = 2; k &l
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值