程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 求任意權值最短路徑的Bellman-Ford算法實現

求任意權值最短路徑的Bellman-Ford算法實現

編輯:C++入門知識

Bellman-Ford算法可以用來解決所要求的最短路徑的圖中含有負數邊的情形。   算法的基本思想:如果兩個結點間存在最短路徑,那麼這條路徑中各個結點最多經過一次(因為如果超過一次,說明路徑中有環,如果是正數環,會使路徑權值增長;若為負數環,最短路徑不存在;若為零環,不影響結果)。因此我們只需迭代n-1次,將起始點到其他各點最多經過n-1條邊的最短路徑求出來即可。     [cpp]  #include <iostream>   using namespace std;      const int MaxSize=10;      int arr[MaxSize][MaxSize];    www.2cto.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[i][j];   }      //計算任意權值的最短路徑的Bellman-Ford算法   //從頂點v找到所有其他定點的最短路徑   void BellmanFord(const int v)   {       //dist數組和path數組的初始化       for(int i=0;i<numNode;++i)       {           dist[i]=arr[v][i];           if(i!=v)               path[i]=v;           else               path[i]=-1;       }          //最多迭代n-1次       for(int len=2;len<numNode;++len)           for(int u=0;u<numNode;++u)               if(u!=v)               {                   //每次都以u為終點,看以i為中轉點到達u的總權值是否比dist[u]小,                   //小的話改寫dist[u]                   for(int i=0;i<numNode;++i)                       if(dist[u]>dist[i]+arr[i][u])                       {                           dist[u]=dist[i]+arr[i][u];                           path[u]=i;                       }               }              //輸出起始結點到各結點的最短路徑       for(int i=0;i<numNode;++i)           cout<<dist[i]<<" ";       cout<<endl;          //輸出最後一個結點最短路徑經過的各結點(其他結點可用類似做法)       int end=numNode-1;       while(path[end]!=-1)       {           cout<<path[end]<<" ";           end=path[end];       }       cout<<endl;   }         int main()   {       createArr();          BellmanFord(0);   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved