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
分享到:
相关推荐
队列优化的Bellman-Ford最短路算法(SPFA,Shortest Path Faster Algorithm)是一种在图论中用于寻找有向图中单源最短路径的算法,它是在经典Bellman-Ford算法基础上进行优化得到的。Bellman-Ford算法本身能够处理...
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)算法是一种用于解决单源最短路径问题的算法,由荷兰计算机科学家艾兹格·狄克斯...对于含有负权重边的最短路径问题,可以使用贝尔曼-福特(Bellman-Ford)算法或者约翰逊(Johnson)算法来解决。
Bellman-Ford算法可以处理含有负权边的最短路问题,而Dijkstra算法对此无能为力。它通过松弛操作,逐步减小源点到所有其他顶点的距离估计,直至达到稳定状态。在执行|V|-1次松弛操作后,如果仍存在可以缩短的路径,...
最短路算法是图论中的一个核心问题,广泛应用于网络设计、交通规划、物流优化、计算机科学中的数据传输等领域。本文将深入探讨最短路算法的原理、常见算法及其应用。 1. 最短路问题定义 最短路问题旨在寻找图中两个...
最短路算法是图论中的一个核心问题,它在计算机科学和网络优化中有着广泛的应用。ACM(国际大学生程序设计竞赛)中,最短路算法是常见的考察点,因此掌握其模板对于参赛者至关重要。这里我们将深入探讨几种常见的最...
本文将详细介绍几种常见的最短路算法,包括Dijkstra算法、Dijkstra的堆优化、Floyd算法以及Bellman-Ford算法。 首先,Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻提出的,用于解决单源最短路径问题。该算法...
2. Bellman-Ford算法:Bellman-Ford算法可以处理存在负权重边的情况,通过松弛操作不断更新节点间的最短路径,重复V-1遍后可确保找到最短路,因为不存在V条边构成的负权环。 3. Floyd-Warshall算法:该算法适用于...
虽然在某些特定条件下,如负权重边存在时,Dijkstra算法可能无法得到正确的结果,但通过适当的修改或使用其他算法(如Bellman-Ford算法),可以解决这些问题。在通信网络、路由选择、图论等领域,Dijkstra算法有着...
3. **Bellman-Ford算法**:与Dijkstra算法不同,Bellman-Ford算法能处理含有负权边的图,但其时间复杂度较高,为O(V * E),V是顶点数,E是边数。在MATLAB中,通过迭代和松弛操作可以找到最短路径。 在实际应用中,...
Bellman-Ford 算法:Bellman-Ford 算法是一种解决单源最短路问题的动态规划算法。该算法的基本思想是从起点出发,依次计算每个顶点到起点的最短路径长度。该算法可以解决带有权值的有向图的单源最短路问题,时间...
在MATLAB中实现最短路算法是图论和网络优化中的一个重要任务,它通常用于解决在给定网络中寻找两个节点之间最经济、最快或最短路径的问题。这里提到的"matlab 最短路算法"可能指的是使用MATLAB来编写程序以解决这类...
常用的算法有Dijkstra算法、Floyd-Warshall算法和Bellman-Ford算法等。 2. **Dijkstra算法** Dijkstra算法是最常用的单源最短路径算法,适用于没有负权边的图。它通过贪心策略逐步扩展最短路径树,每次选取当前未...
2. Bellman-Ford算法:Bellman-Ford算法可以处理带有负权边的图,同样能找出单源最短路径。其时间复杂度为O(n*|E|),适用于稀疏图。若要找到k-最短路径,可以在找到第一条最短路径后,通过回溯和重新计算剩余边的...
2. **Bellman-Ford算法**:Bellman-Ford算法能够处理带有负权重的边,通过松弛操作逐步减小源点到所有顶点的距离估计。它需要进行V-1次迭代(V为顶点数量),确保找到最短路径。若存在负权环,则该算法会检测到并...
- **负权环**:如果存在负权环,Bellman-Ford算法能够检测到,并表明图中不存在最短路径,因为可以无限次地沿着负权环缩短路径。 **四、差分约束系统** - 差分约束系统用于解决某些类型的最短路径问题,尤其是那些...
1. 初始化:首先,计算原图中所有顶点对之间的最短路径,这可以通过Bellman-Ford算法或者Floyd-Warshall算法实现,即使在存在负权重边的情况下也能找到正确的路径。得到的这些距离作为新图的权重。 2. 构建新图:...