Bellman-Ford算法求最短路径

struct Node
{
	int v;
	int dis;
};

vector<Node> adj[maxv];  //图的邻接表 
int n;   //n为顶点数 
int d[maxv];   //从起点到各点的最短路径长度 

bool Bellman(int s)
{
	fill(d,d+maxv,inf);
	d[s]=0;
	
	//求数组d 
	for(int i=0;i<n-1;i++)  //最多n-1轮,每轮确定一层 
	{
		for(int u=0;u<n;u++) //每轮都遍历所有边 
		{
			for(int j=0;j<adj[u].size();j++)
			{
				int v=adj[u][j].v;
				int dis=adj[u][j].dis;
				if(d[u]+dis<d[v])
				{
					d[v]=d[u]+dis;
				} 
			}
		}
	}
	
	//判断负环
	for(int u=0;u<n;u++)
	{
		for(int j=0;j<adj[u].size();j++)
		{
			int v=adj[u][j].v;
			int dis=adj[u][j].dis;
			if(d[u]+dis<d[v])
			{
				return false;
			}
		}
	}
	return true;	
}

 

### 使用 Python 实现 Bellman-Ford 算法 Bellman-Ford 算法用于计算带权重图中从单一源节出发到达其他各节最短路径,能够处理带有负权重边的情况并检测负权环的存在[^1]。 #### 初始化阶段 创建一个数组 `dist` 来存储从起始节到各个节的距离估计值。初始时除起外所有距离设为无穷大 (`inf`) 表示未知;设置起自身的距离为0。同时准备一个列表来保存前驱节以便重建终找到的最短路径[^2]。 ```python import math def initialize_single_source(graph, source): distances = {node: math.inf for node in graph} predecessors = {node: None for node in graph} distances[source] = 0 return distances, predecessors ``` #### 主循环迭代更新过程 对于每一轮遍历,尝试通过当前已知的佳路径去改进其它可能更优的新路径直到不再发生变化为止。具体来说就是对所有的边执行一次松弛操作——如果经过某条边可以使目标结获得更小总成本,则更新该结的成本以及记录下这条改变其状态的关键边所连接的那个前置结[^3]。 ```python def relax(u, v, weight_uv, distances, predecessors): if distances[u] != math.inf and distances[v] > distances[u] + weight_uv: distances[v] = distances[u] + weight_uv predecessors[v] = u def bellman_ford_algorithm(edges, num_vertices, start_vertex): # Initialize single-source shortest paths problem. distances, predecessors = initialize_single_source(range(num_vertices), start_vertex) # Relax edges repeatedly. for _ in range(num_vertices - 1): for edge in edges: u, v, w = edge relax(u, v, w, distances, predecessors) # Check for negative-weight cycles. for edge in edges: u, v, w = edge if distances[u] != math.inf and distances[u] + w < distances[v]: raise ValueError("Graph contains a negative-weight cycle") return distances, predecessors ``` 此实现方式遵循了经典贝尔曼-福特算法的设计思路,在每次迭代过程中都尽可能地优化每一个可达顶之间的距离关系,并且能够在后一步检查是否存在任何可能导致无限下降情况发生的负数权重闭环现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值