灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3493回复:0

求任意权值最短路径的Bellman-Ford算法实现

楼主#
更多 发布于:2012-12-17 15:03

Bellman-Ford算法可以用来解决所要求的最短路径的图中含有负数边的情形。

算法的基本思想:如果两个结点间存在最短路径,那么这条路径中各个结点最多经过一次(因为如果超过一次,说明路径中有环,如果是正数环,会使路径权值增长;若为负数环,最短路径不存在;若为零环,不影响结果)。因此我们只需迭代n-1次,将起始点到其他各点最多经过n-1条边的最短路径求出来即可。


[cpp]
#include <iostream>  
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
游客

返回顶部