Bellman-Ford模板

Bellman-Ford算法流程分为三个阶段:

(1)初始化:将除源点外的所有顶点的最短距离估计值d[v]←+∞, d[s] ←0;

(2)迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离;(运行|v|-1次)

(3)检验负权回路:判断边集E中的每一条边的两个端点是否收敛。如果存在未收敛的顶点,则算法返回false,表明问题无解;否则算法返回true,并且从源点可达的顶点v的最短距离保存在d[v]中。

算法描述如下:

Bellman-Ford(G,w,s)boolean//G,边集函数ws为源点

1foreachvertexv∈ V(G) do//初始化1阶段

2d[v]←+∞

3d[s] ←0;//1阶段结束

4fori=1to|v|-1do//2阶段开始,双重循环。

5foreach edge(u,v) ∈E(G) do //边集数组要用到,穷举每条边。

6If d[v]>d[u]+w(u,v)then//松弛判断

7d[v]=d[u]+w(u,v)//松弛操作2阶段结束

8foreach edge(u,v) ∈E(G) do

9If d[v]>d[u]+w(u,v)then

10Exitfalse

11Exit true

算法模板(C++)

const int INF = 999999;  
const int MAXN = 10005;

typedef struct Node
{
	int v;//起点
	int u;//终点
	int w; 
}Node;
Node edge[MAXN];
int dist[MAXN];     //此处要特别注意,bellman-ford算法中不要使用0x7fffffff,为此wa了n次 
int edgenum, n;

bool BellmanFord(int s)
{
	int i, j;
	bool flag = false;
	for(i = 1; i <= n; ++i)
	{
		dist[i] = INF;        //其余点的距离设置为无穷
	}
	dist[s] = 0;             //源点的距离设置为0
	for(i = 1;i < n; ++i)
	{
		flag = false;       //优化:如果某次迭代中没有任何一个d值改变,尽可以立刻退出迭代而不需要把所有的n-1次迭代都做完
		for(j = 0; j < edgenum; ++j)
		{
			if(dist[edge[j].u] > dist[edge[j].v] + edge[j].w)
			{
				flag = true;
				dist[edge[j].u] = dist[edge[j].v] + edge[j].w;
			}
		}
		if(!flag)
		{
			break;
		}
	}
	for(i = 0; i < edgenum; ++i)
	{
		if(dist[edge[i].v] < INF && dist[edge[i].u] > dist[edge[i].v] + edge[i].w)
		{
			return false;
		}
	}
	return true;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值