论坛
门户
内部优惠
喜欢
话题
VIP会员
搜索
新浪微博
登录
注册
100%
100%
首页
>
软件开发
>
C/C++语言
>
求任意权值最短路径的Bellman-Ford算法实现
回复
« 返回列表
灯火互联
管理员
注册日期
2011-07-27
发帖数
41778
QQ
火币
41290枚
粉丝
1086
关注
100
加关注
写私信
打招呼
阅读:
3578
回复:
0
求任意权值最短路径的Bellman-Ford算法实现
楼主
#
更多
只看楼主
倒序阅读
发布于:2012-12-17 15:03
保存
100%
100%
[]
1
Bellman-Ford算法可以用来解决所要求的最短路径的图中含有负数边的情形。
算法的基本思想:如果两个结点间存在最短路径,那么这条路径中各个结点最多经过一次(因为如果超过一次,说明路径中有环,如果是正数环,会使路径权值增长;若为负数环,最短路径不存在;若为零环,不影响结果)。因此我们只需迭代n-1次,将起始点到其他各点最多经过n-1条边的最短路径求出来即可。
[cpp]
#include <
ios
tream>
using namespace std;
const int MaxSize=10;
int arr[MaxSize][MaxSize];
www.atcpu.com
int dist[MaxSize]; //保存起点到各结点最短路径的数组
int path[MaxSize]; //数组元素保存最短路径中经过的前一个结点
int numNode=0;
void createArr()
{
cin>>numNode;
for(int i=0;i<numNode;++i)
for(int j=0;j<numNode;++j)
cin>>arr
[j];
}
//计算任意权值的最短路径的Bellman-Ford算法
//从顶点v找到所有其他定点的最短路径
void BellmanFord(const int v)
{
//dist数组和path数组的初始化
for(int i=0;i<numNode;++i)
{
dist
=arr[v]
;
if(i!=v)
path
=v;
else
path
=-1;
}
//最多迭代n-1次
for(int len=2;len<numNode;++len)
for(int u=0;u<numNode;++u)
if(u!=v)
{
//每次都以u为终点,看以i为中转点到达u的总权值是否比dist
小,
//小的话改写dist
for(int i=0;i<numNode;++i)
if(dist
>dist
+arr
)
{
dist
=dist
+arr
;
path
=i;
}
}
//输出起始结点到各结点的最短路径
for(int i=0;i<numNode;++i)
cout<<dist
<<" ";
cout<<endl;
//输出最后一个结点最短路径经过的各结点(其他结点可用类似做法)
int end=numNode-1;
while(path[end]!=-1)
{
cout<<path[end]<<" ";
end=path[end];
}
cout<<endl;
}
int main()
{
createArr();
BellmanFord(0);
}
喜欢
0
评分
0
最新喜欢:
淘宝天猫隐藏优惠券地址
回复
100%
发帖
回复
« 返回列表
普通帖
您需要登录后才可以回帖,
登录
或者
注册
100%
返回顶部
关闭
最新喜欢