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算法(解决负权边)

前两节我们写了Floyd-Warshall算法http://blog.csdn.net/wtyvhreal/article/details/43315705和 Dijkstra算法http://bl...
  • wtyvhreal
  • wtyvhreal
  • 2015年02月03日 15:45
  • 3967

可以处理负权的单源最短路径的SPFA算法带图详解(自己画的图)

可以处理负权的单源最短路径的SPFA算法带图详解(自己画的图) 分类: 算法2013-11-05 19:15 367人阅读 评论(0) 收藏 举报 SPFA算法 算法大致流程...
  • pi9nc
  • pi9nc
  • 2014年04月04日 15:30
  • 3624

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

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

图算法 单源最短路径 Bellman_Ford算法(边权值为负情况)

一、前瞻   在之前的单源最短路径Dijkstra算法中,博主给出了最短路径的一些基本概念和问题,并且给出了对权值不能为负的图使用Dijkstra算法求解单源最短路径问题的方法。   我们提到,D...
  • tham_
  • tham_
  • 2015年05月27日 17:14
  • 982

求赋权图中一个结点到所有结点的最短路径的长度

描述 给一个赋权图(无向图),求0号结点到其余所有结点的最短路径的长度。   输入 先输入一个正整数n,然后输入赋权图的邻接矩阵(10000表示无穷大)   输出 按结点编号的顺序输出0...
  • axiqia
  • axiqia
  • 2016年03月25日 22:31
  • 1739

51nod-距离之和最小(中位数)

1110 距离之和最小 V3 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 X轴上有N个点,每...
  • haut_ykc
  • haut_ykc
  • 2016年12月20日 18:13
  • 287

1110 距离之和最小 V3

X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i]。点P到点P[i]的带权距离 = 实际距离 * P[i]的权值。求X轴上一点使它到这N个点的带权距离之和最小,输出这个最小的带...
  • qingqiu_WD
  • qingqiu_WD
  • 2018年01月02日 21:37
  • 16

多源有权图的最短路径 floyd算法(动态规划能解决负权边)7.1.3

核心代码只有5行呀 for(int k=0;kNv;k++) for(int i=0;iNv;i++) for(int j=0;jNv;j++) if...
  • qq_26046771
  • qq_26046771
  • 2017年04月25日 09:13
  • 196

SPFA 最短路 带负权边的---- 粗了解

SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。 算法大致流程是用一个队列来进行维护。 初始时将源加...
  • WR_technology
  • WR_technology
  • 2016年04月26日 21:28
  • 1556

dijkstra(n^2)求某个点到所有点的最短路径

#include const int maxn=1001,inf=1000000000; using namespace std; int a[maxn][maxn],d[maxn],p[maxn]...
  • qq_35653247
  • qq_35653247
  • 2016年08月26日 17:36
  • 1531
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bellman-Ford——解决负权边(求某点到所有点的最短距离)
举报原因:
原因补充:

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