`
yzmduncan
  • 浏览: 330417 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

单源最短路之——优化的Bellman-Ford算法

阅读更多

Bellman-Ford用来解决单源最短路径问题,相比Dijkastra,它的限制更少:边权值可以为负。同时,还能检测出负环(正环)。但普通的Bellman-Ford时间复杂度高于Dijkastra,因此更多人喜欢使用SPFA。但经过优化的Bellman-Ford算法,时间复杂度大大降低,可以相比于SPFA。

这里推荐:http://www.cppblog.com/apple365/archive/2008/11/27/67943.html,这里有详细Bellman-Ford原理及其优化过程。

 

#include <iostream>
using namespace std;
const double MAX = -1000000.0;
typedef struct
{
	int v1;
	int v2;
	double rate;
	double comm;
}Edge;
Edge e[201];
int n;				//货币种数
int m;				//银行总数
int s;				//初始货币类型
double v;			//初始财产
double d[101];		//源点s到各点的最小距离

int main()
{
	bool flag;
	int i,j,p,q,num;
	cin>>n>>m>>s>>v;
	for(i = 1,num = 0; i <= m; i++)
	{
		cin>>p>>q;
		num++;
		e[num].v1 = p;
		e[num].v2 = q;
		cin>>e[num].rate;
		cin>>e[num].comm;
		num++;
		e[num].v1 = q;
		e[num].v2 = p;
		cin>>e[num].rate;
		cin>>e[num].comm;
	}
	for(i = 1; i <= n; i++)
		d[i] = MAX;
	d[s] = v;
	/*优化的bellman-ford
	从第一次到第n-1次循环中,若有一次所有的边都没有松弛,以后所有边也不需要松弛,显然算法可以终止!
	bellman-ford算法在做完n-1次之后,若不存在正环,肯定会收敛,即第n次跳出(此时还要判断d[s]的值是否增加)。再做一次,
	即到第n次还满足松弛条件,说明存在正环*/
	for(i = 1; i <= n; i++)
	{
		flag = false;
		for(j = 1; j <= num; j++)
		{
			if(d[e[j].v1] != MAX && (d[e[j].v1] - e[j].comm)*e[j].rate > d[e[j].v2])	//松弛条件
			{
				d[e[j].v2] = (d[e[j].v1] - e[j].comm)*e[j].rate;
				flag = true;
			}
		}
		if(!flag) break;
	}
	if(i == n + 1)
		cout<<"YES\n";
	else
	{
		if(d[s] > v)
			cout<<"YES\n";
		else
			cout<<"NO\n";
	}
	return 0;
}

 

参加poj1860,3259

 

 

分享到:
评论

相关推荐

    队列优化的Bellmanford最短路算法(SPFA)C++实现

    队列优化的Bellman-Ford最短路算法(SPFA,Shortest Path Faster Algorithm)是一种在图论中用于寻找有向图中单源最短路径的算法,它是在经典Bellman-Ford算法基础上进行优化得到的。Bellman-Ford算法本身能够处理...

    求单源最短路径(算法分析中)c++

    2. **Bellman-Ford算法**:由Richard Bellman和Leonard Ford分别独立提出,能处理含有负权重的边。该算法通过松弛操作逐步减小源节点到所有节点的距离估计,共需进行V-1轮迭代,以确保找到最短路径。如果在V-1轮后仍...

    算法合集之《最短路算法及其应用》

    2. Bellman-Ford算法:Bellman-Ford算法能处理含有负权边的图,同样解决单源最短路径问题。它通过松弛操作逐步更新所有节点到起点的距离,重复V-1遍(V为图的顶点数)即可确保找到最短路径。在MATLAB中,可以利用...

    最短路课件 求单源最短路径

    本课件重点讲解了三种广泛使用的算法:Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法。 1. Dijkstra算法: Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出的,主要用于寻找带非负权重的图中...

    最短路的算法---Dijkstra算法

    狄克斯特拉(Dijkstra)算法是一种用于解决单源最短路径问题的算法,由荷兰计算机科学家艾兹格·狄克斯...对于含有负权重边的最短路径问题,可以使用贝尔曼-福特(Bellman-Ford)算法或者约翰逊(Johnson)算法来解决。

    最短路(信息学奥赛一本通-T1382).rar

    Bellman-Ford算法可以处理含有负权边的最短路问题,而Dijkstra算法对此无能为力。它通过松弛操作,逐步减小源点到所有其他顶点的距离估计,直至达到稳定状态。在执行|V|-1次松弛操作后,如果仍存在可以缩短的路径,...

    数学建模中的最短路算法

    最短路算法是图论中的一个核心问题,广泛应用于网络设计、交通规划、物流优化、计算机科学中的数据传输等领域。本文将深入探讨最短路算法的原理、常见算法及其应用。 1. 最短路问题定义 最短路问题旨在寻找图中两个...

    最短路算法模板 最短路算法模板

    最短路算法是图论中的一个核心问题,它在计算机科学和网络优化中有着广泛的应用。ACM(国际大学生程序设计竞赛)中,最短路算法是常见的考察点,因此掌握其模板对于参赛者至关重要。这里我们将深入探讨几种常见的最...

    图论最短路方法详细介绍

    本文将详细介绍几种常见的最短路算法,包括Dijkstra算法、Dijkstra的堆优化、Floyd算法以及Bellman-Ford算法。 首先,Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻提出的,用于解决单源最短路径问题。该算法...

    最短路(HDU-2544).rar

    2. Bellman-Ford算法:Bellman-Ford算法可以处理存在负权重边的情况,通过松弛操作不断更新节点间的最短路径,重复V-1遍后可确保找到最短路,因为不存在V条边构成的负权环。 3. Floyd-Warshall算法:该算法适用于...

    05-最短路算法-XXXX-BIG.pptx

    虽然在某些特定条件下,如负权重边存在时,Dijkstra算法可能无法得到正确的结果,但通过适当的修改或使用其他算法(如Bellman-Ford算法),可以解决这些问题。在通信网络、路由选择、图论等领域,Dijkstra算法有着...

    第8讲 最短路问题_最短路径_

    3. **Bellman-Ford算法**:与Dijkstra算法不同,Bellman-Ford算法能处理含有负权边的图,但其时间复杂度较高,为O(V * E),V是顶点数,E是边数。在MATLAB中,通过迭代和松弛操作可以找到最短路径。 在实际应用中,...

    图论入门与最短路_黄哲威.pdf

    Bellman-Ford 算法:Bellman-Ford 算法是一种解决单源最短路问题的动态规划算法。该算法的基本思想是从起点出发,依次计算每个顶点到起点的最短路径长度。该算法可以解决带有权值的有向图的单源最短路问题,时间...

    matlab 最短路算法

    在MATLAB中实现最短路算法是图论和网络优化中的一个重要任务,它通常用于解决在给定网络中寻找两个节点之间最经济、最快或最短路径的问题。这里提到的"matlab 最短路算法"可能指的是使用MATLAB来编写程序以解决这类...

    wxh 最短路树的计数,产生和优化问题.rar

    常用的算法有Dijkstra算法、Floyd-Warshall算法和Bellman-Ford算法等。 2. **Dijkstra算法** Dijkstra算法是最常用的单源最短路径算法,适用于没有负权边的图。它通过贪心策略逐步扩展最短路径树,每次选取当前未...

    最短路径算法实现 k-shortest-paths

    2. Bellman-Ford算法:Bellman-Ford算法可以处理带有负权边的图,同样能找出单源最短路径。其时间复杂度为O(n*|E|),适用于稀疏图。若要找到k-最短路径,可以在找到第一条最短路径后,通过回溯和重新计算剩余边的...

    算法刷题提高阶段-图论1

    2. **Bellman-Ford算法**:Bellman-Ford算法能够处理带有负权重的边,通过松弛操作逐步减小源点到所有顶点的距离估计。它需要进行V-1次迭代(V为顶点数量),确保找到最短路径。若存在负权环,则该算法会检测到并...

    第六讲最短路(算法艺术).ppt

    - **负权环**:如果存在负权环,Bellman-Ford算法能够检测到,并表明图中不存在最短路径,因为可以无限次地沿着负权环缩短路径。 **四、差分约束系统** - 差分约束系统用于解决某些类型的最短路径问题,尤其是那些...

    图论- 最短路- Johnson 算法.rar

    1. 初始化:首先,计算原图中所有顶点对之间的最短路径,这可以通过Bellman-Ford算法或者Floyd-Warshall算法实现,即使在存在负权重边的情况下也能找到正确的路径。得到的这些距离作为新图的权重。 2. 构建新图:...

Global site tag (gtag.js) - Google Analytics