Bellman-Ford——解决负权边(求某点到所有点的最短距离)

原创 2016年08月29日 13:20:21

Bellman-Ford与dijkstra一样 都是求某点到所有点的最短距离

先说一下Bellman-Ford的思路:将m条变全部枚举(假设第i条边连接的点是u[i].v[i])判断v[i]到起点的距离是否可以通过v[i]到u[i]的距离和u[i]到起点的距离和替换从而更新dis[v[i]],显然,第一次循环一定会将离起点最近的点更新至最小,第二次循环又会将除起点外离离起点最近的点最近的点(有点绕,多看几遍)更新,以此类推,最多循环n-1次就能将所有dis更新。当然也有可能,一次循环就更新了所有的dis至最小值,这个待会再考虑。(这种更新称为“松弛”)

核心代码:

for(k=1;k<=n-1;k++){
	for(i=1;i<=m;i++){
		if(dis[v[i]]>dis[u[i]]+w[i]){
			dis[v[i]]=dis[u[i]]+w[i];
		}
	}
}


完整代码:

#include<cstdio>
using namespace std;
int main(){
	int i,j,k,m,n,u[10],v[10],w[10],dis[10];
	const int inf=99999999;
	scanf("%d %d",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%d %d %d",&u[i],&v[i],&w[i]);
	}
	for(i=1;i<=n;i++){
		dis[i]=inf;
	}
	dis[1]=0;
	for(k=1;k<n;k++){
		for(i=1;i<=m;i++){
			if(dis[v[i]]>dis[u[i]]+w[i]){
				dis[v[i]]=dis[u[i]]+w[i];
			}
		}
	}
	for(i=1;i<=n;i++){
		printf("%d ",dis[i]);
	}
	return 0;
}
显然算法复杂度是O(NM)。
之前也说过,有可能不需要n-1轮就已经更新完毕,所以我们需要一个判断变量,判断每一轮松弛,如果m条边都没有更新dis,那么说明更新完毕,直接break;

另外,Bellman-Ford显然可以判断有没有负权环,之前已经分析过,最多n-1轮,就可以将所有的dis更新至最小,若第n轮还能继续更新,说明存在负权环。

核心代码:

for(k=1;k<=n-1;k++){
	for(i=1;i<=m;i++){
		if(dis[v[i]]>dis[u[i]]+w[i]){
			dis[v[i]]=dis[u[i]]+w[i];
		}
	}
}//更新 
flag=0;
for(i=1;i<=m;i++){
	if(dis[v[i]]>dis[u[i]]+w[i]){
		flag=1;
		break;
	}
}
if(flag==1)printf("有负权环");//判断负权环 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Bellman-Ford的队列优化(求某点到所有点的最短距离)

思路: 将源点入队,从源点开始邻点便利,判断所有邻点中是否需要更新,将需要更新的更新完后判断此点是否在队列内,若不在,将此点入队,重复此过程。 #include using namespace s...

Bellman-Ford(贝尔曼,福特)算法——解决负权边

Dijkstra算法不能解决带有负权边的图(边的权值为负数)。而Bellman-Ford算法可以解决这个问题 #include using namespace std; int main() { ...
  • Icarus_
  • Icarus_
  • 2016年03月05日 13:47
  • 824

最短路径(三)—Bellman-Ford算法(解决负权边)

前两节我们写了Floyd-Warshall算法http://blog.csdn.net/wtyvhreal/article/details/43315705和 Dijkstra算法http://bl...

Bellman-Ford算法--解决负权边的单源最短路径算法

在http://blog.csdn.net/hacker_zhidian/article/details/54915152这篇博客中,我们用Dijkstra算法单源最短路径,但是Dijkstra算法对...

pku 3259 Wormholes (Bellman ford判断负权边)

题目链接:  pku3259 Wormholes    之前在数据结构书上看了dijkstra 和floyed(从来没有自己写过)   但是有负权边的一直不会   所以专门找了题目看看...

图--单源最短路径 -Bellman Ford 算法(可以存在负权边的情况和负权回路)算法导论p362

Bellman Ford 算法  可以存在负权边的情况下解决单源最短路问题和,当出现负权回路时返回布尔值0,不然,则返回1,并可以源点到各点输出最短路径 主要步骤: 1、建立图(连接矩阵); 2、运行...

带负权的最短路bellman_ford——POJ 3259 Wormholes题解

Description While exploring his many farms, Farmer John has discovered a number of amazing wormho...

bellman-ford算法——最短路问题,判断是否存在负权回路或正权回路

转载链接:点击打开链接 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。 ...
  • txgANG
  • txgANG
  • 2016年07月29日 21:36
  • 1317

Bellman-Ford算法---求包含负权边单源最短路径(动态规划)

单源最短路径:给定一个图,和一个源顶点src,找到从src到其它所有所有顶点的最短路径,图中可能含有负权值的边。 Dijksra的算法是一个贪婪算法,时间复杂度是O(VLogV)(使用最小堆)。但是...
  • will130
  • will130
  • 2015年06月04日 22:43
  • 1137

最短路径基本介绍(3)--Bellman-Ford算法(单源最短路径算法,可求负权)

转载链接:http://www.wutianqi.com/?p=1912 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bellman-Ford——解决负权边(求某点到所有点的最短距离)
举报原因:
原因补充:

(最多只允许输入30个字)