Bellman-ford算法

当图中存在负权边时,最短路径问题需要考虑负环的影响。Bellman-Ford算法是解决这类问题的动态规划方法,通过限制最多走n-1条边来避免环的影响,逐步更新源点到各顶点的最短距离。算法通过三层循环不断迭代,直到所有顶点的最短路径稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

所以我们平时说的最短路一定是不含有环的,不管是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 < n; k++ )
	{
		for( u = 0; u < n; u++ )
		{
			if( u != start )
			{
				for( j = 0; j < n; j++ )
					if( map[j][u] != INF && lowcost[j] + map[j][u] < lowcost[u] )
						lowcost[u] = lowcost[j] + map[j][u];

			}
		}
	}
}


bellman-ford算法和dijkstra的比较:

1.dijkstra算法求解过程中,是分两个集合,已经找到的最短路点集合S和还未找到的集合T,当一个点求出最短路以后,就并入了以求出的集合S,并且不再改变了,更新的是这个点到未找到集合T中顶点路径长度。

2.而bellman-ford算法在求解过程中,每次循环每个顶点lowcost[]值都可能要改变,所以要等整个算法结束以后才能确定lowcost[]整个的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值