青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 70  文章 - 160  trackbacks - 0

公告:
知識共享許可協議
本博客采用知識共享署名 2.5 中國大陸許可協議進行許可。本博客版權歸作者所有,歡迎轉載,但未經作者同意不得隨機刪除文章任何內容,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 具體操作方式可參考此處。如您有任何疑問或者授權方面的協商,請給我留言。

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

積分與排名

  • 積分 - 180627
  • 排名 - 147

最新評論

閱讀排行榜

評論排行榜

相關文章:

1.Dijkstra算法:

http://www.wutianqi.com/?p=1890

2.Floyd算法:

http://www.wutianqi.com/?p=1903

Dijkstra算法是處理單源最短路徑的有效算法,但它局限于邊的權值非負的情況,若圖中出現權值為負的邊,Dijkstra算法就會失效,求出的最短路徑就可能是錯的。這時候,就需要使用其他的算法來求解最短路徑,Bellman-Ford算法就是其中最常用的一個。該算法由美國數學家理查德•貝爾曼(Richard Bellman, 動態規劃的提出者)和小萊斯特•福特(Lester Ford)發明。Bellman-Ford算法的流程如下:
給定圖G(V, E)(其中V、E分別為圖G的頂點集與邊集),源點s,

  • 數組Distant[i]記錄從源點s到頂點i的路徑長度,初始化數組Distant[n]為, Distant[s]為0;
  •  
    以下操作循環執行至多n-1次,n為頂點數:
    對于每一條邊e(u, v),如果Distant[u] + w(u, v) < Distant[v],則另Distant[v] = Distant[u]+w(u, v)。w(u, v)為邊e(u,v)的權值;
    若上述操作沒有對Distant進行更新,說明最短路徑已經查找完畢,或者部分點不可達,跳出循環。否則執行下次循環;
  • 為了檢測圖中是否存在負環路,即權值之和小于0的環路。對于每一條邊e(u, v),如果存在Distant[u] + w(u, v) < Distant[v]的邊,則圖中存在負環路,即是說改圖無法求出單源最短路徑。否則數組Distant[n]中記錄的就是源點s到各頂點的最短路徑長度。

可知,Bellman-Ford算法尋找單源最短路徑的時間復雜度為O(V*E).

首先介紹一下松弛計算。如下圖:


 

松弛計算之前,點B的值是8,但是點A的值加上邊上的權重2,得到5,比點B的值(8)小,所以,點B的值減小為5。這個過程的意義是,找到了一條通向B點更短的路線,且該路線是先經過點A,然后通過權重為2的邊,到達點B。
當然,如果出現一下情況


 

則不會修改點B的值,因為3+4>6。
 
Bellman-Ford算法可以大致分為三個部分
第一,初始化所有點。每一個點保存一個值,表示從原點到達這個點的距離,將原點的值設為0,其它的點的值設為無窮大(表示不可達)。
第二,進行循環,循環下標為從1到n-1(n等于圖中點的個數)。在循環內部,遍歷所有的邊,進行松弛計算。
第三,遍歷途中所有的邊(edge(u,v)),判斷是否存在這樣情況:
d(v) > d (u) + w(u,v)
則返回false,表示途中存在從源點可達的權為負的回路。
 
之所以需要第三部分的原因,是因為,如果存在從源點可達的權為負的回路。則 應為無法收斂而導致不能求出最短路徑。
考慮如下的圖:
 

經過第一次遍歷后,點B的值變為5,點C的值變為8,這時,注意權重為-10的邊,這條邊的存在,導致點A的值變為-2。(8+ -10=-2)
 
 

第二次遍歷后,點B的值變為3,點C變為6,點A變為-4。正是因為有一條負邊在回路中,導致每次遍歷后,各個點的值不斷變小。
 
在回過來看一下bellman-ford算法的第三部分,遍歷所有邊,檢查是否存在d(v) > d (u) + w(u,v)。因為第二部分循環的次數是定長的,所以如果存在無法收斂的情況,則肯定能夠在第三部分中檢查出來。比如
 

此時,點A的值為-2,點B的值為5,邊AB的權重為5,5 > -2 + 5. 檢查出來這條邊沒有收斂。
 
所以,Bellman-Ford算法可以解決圖中有權為負數的邊的單源最短路徑問。

個人感覺算法導論講解很不錯,把這一章貼出來和大家分享:

24.1 The Bellman-Ford algorithm

The Bellman-Ford algorithm solves the single-source shortest-paths problem in the general case in which edge weights may be negative. Given a weighted, directed graph G = (V, E) with source s and weight function w : E  R, the Bellman-Ford algorithm returns a boolean value indicating whether or not there is a negative-weight cycle that is reachable from the source. If there is such a cycle, the algorithm indicates that no solution exists. If there is no such cycle, the algorithm produces the shortest paths and their weights.

The algorithm uses relaxation, progressively decreasing an estimate d[v] on the weight of a shortest path from the source s to each vertex v  V until it achieves the actual shortest-path weight δ(s, v). The algorithm returns TRUE if and only if the graph contains no negative-weight cycles that are reachable from the source.

BELLMAN-FORD(G, w, s)
1  INITIALIZE-SINGLE-SOURCE(G, s)
2  for i1 to |V[G]| - 1
3       do for each edge (u, v) ∈ E[G]
4              do RELAX(u, v, w)
5  for each edge (u, v) ∈ E[G]
6       do if d[v] > d[u] + w(u, v)
7             then return FALSE
8  return TRUE

Figure 24.4 shows the execution of the Bellman-Ford algorithm on a graph with 5 vertices. After initializing the dand π values of all vertices in line 1, the algorithm makes |V| – 1 passes over the edges of the graph. Each pass is one iteration of the for loop of lines 2-4 and consists of relaxing each edge of the graph once. Figures 24.4(b)-(e) show the state of the algorithm after each of the four passes over the edges. After making |V|- 1 passes, lines 5-8 check for a negative-weight cycle and return the appropriate boolean value. (We’ll see a little later why this check works.)

(單擊圖片可以放大)

Figure 24.4: The execution of the Bellman-Ford algorithm. The source is vertex s. The d values are shown within the vertices, and shaded edges indicate predecessor values: if edge (u, v) is shaded, then π[v] = u. In this particular example, each pass relaxes the edges in the order (t, x), (t, y), (t, z), (x, t), (y, x), (y, z), (z, x), (z, s), (s, t), (s, y). (a) The situation just before the first pass over the edges. (b)-(e) The situation after each successive pass over the edges. The d and π values in part (e) are the final values. The Bellman-Ford algorithm returns TRUE in this example.

The Bellman-Ford algorithm runs in time O(V E), since the initialization in line 1 takes Θ(V) time, each of the |V| – 1 passes over the edges in lines 2-4 takes Θ(E) time, and the for loop of lines 5-7 takes O(E) time.

以下是Bellman-Ford代碼:

/*
* About:  Bellman-Ford算法
* Author: Tanky Woo
* Blog:   www.WuTianqi.com
*/
 
#include 
<iostream>
using namespace std;
const int maxnum = 100;
const int maxint = 99999;
 
// 邊,
typedef struct Edge{
    
int u, v;    // 起點,重點
    int weight;  // 邊的權值
}Edge;
 
Edge edge[maxnum];     
// 保存邊的值
int  dist[maxnum];     // 結點到源點最小距離
 
int nodenum, edgenum, source;    // 結點數,邊數,源點
 
// 初始化圖
void init()
{
    
// 輸入結點數,邊數,源點
    cin >> nodenum >> edgenum >> source;
    
for(int i=1; i<=nodenum; ++i)
        dist[i] 
= maxint;
    dist[source] 
= 0;
    
for(int i=1; i<=edgenum; ++i)
    {
        cin 
>> edge[i].u >> edge[i].v >> edge[i].weight;
        
if(edge[i].u == source)          //注意這里設置初始情況
            dist[edge[i].v] = edge[i].weight;
    }
}
 
// 松弛計算
void relax(int u, int v, int weight)
{
    
if(dist[v] > dist[u] + weight)
        dist[v] 
= dist[u] + weight;
}
 
bool Bellman_Ford()
{
    
for(int i=1; i<=nodenum-1++i)
        
for(int j=1; j<=edgenum; ++j)
            relax(edge[j].u, edge[j].v, edge[j].weight);
    
bool flag = 1;
    
// 判斷是否有負環路
    for(int i=1; i<=edgenum; ++i)
        
if(dist[edge[i].v] > dist[edge[i].u] + edge[i].weight)
        {
            flag 
= 0;
            
break;
        }
    
return flag;
}
int main()
{
    
//freopen("input3.txt", "r", stdin);
    init();
    
if(Bellman_Ford())
        
for(int i = 1 ;i <= nodenum; i++)
            cout 
<< dist[i] << endl;
    
return 0;
}
posted on 2011-01-17 20:48 Tanky Woo 閱讀(4601) 評論(2)  編輯 收藏 引用

FeedBack:
# re: 最短路徑算法—Bellman-Ford(貝爾曼-福特)算法分析與實現(C/C++) 2011-01-19 17:35 flagman
Boost的關于圖論的Graph庫里,就有基于bellmanford的實現,而且是可配置的。  回復  更多評論
  
# re: 最短路徑算法—Bellman-Ford(貝爾曼-福特)算法分析與實現(C/C++) 2013-02-13 19:40 
即使自己今天的狀態大多是基于在計算機上面的過程當中尋找屬于自己的想法的或者閱讀習慣的過程,從而在紀錄當中保持自己對于狀態的實際需要的平衡,而關于對于工作需要的關注實際上還沒有一個能夠被實現的需要  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              欧美日韩在线电影| 久久久久国产精品一区三寸| 国产精品久久综合| 久久久av水蜜桃| 久久精品国产清高在天天线| 在线看一区二区| 亚洲一区二区网站| 亚洲国产婷婷香蕉久久久久久99 | 亚洲专区一二三| 亚洲国产高清一区二区三区| 一区二区三区久久网| 亚洲国产福利在线| 久久精品国产精品| 性亚洲最疯狂xxxx高清| 欧美黄色免费| 欧美第一黄色网| 国产一区二区三区高清播放| 亚洲精品永久免费精品| 亚洲国产精品女人久久久| 亚洲午夜一区二区| 亚洲视屏在线播放| 国产精品看片资源| 亚洲视频在线二区| 午夜精品久久久久久久白皮肤| 欧美日韩免费在线| 亚洲精品在线视频| 亚洲欧美色婷婷| 国模私拍一区二区三区| 久久精品人人做人人爽| 免费亚洲一区| 亚洲美女av网站| 国产精品乱码妇女bbbb| 小黄鸭精品aⅴ导航网站入口 | 亚洲欧洲精品天堂一级| 欧美日韩a区| 中国av一区| 久久躁狠狠躁夜夜爽| 亚洲美女在线视频| 欧美午夜精品久久久久久浪潮| 正在播放欧美视频| 欧美激情免费观看| 亚洲午夜激情免费视频| 国产精品久久久久9999| 免费看精品久久片| 亚洲欧美国产精品桃花| 亚洲高清影视| 校园春色国产精品| 亚洲精品视频二区| 国产毛片一区| 国产精品国产三级国产aⅴ浪潮| 欧美在线观看视频在线| 亚洲经典自拍| 欧美成人小视频| 麻豆成人在线| 久久精品伊人| 久久九九精品| 久久免费视频网| 欧美一区二区三区喷汁尤物| 亚洲国产日韩在线一区模特| 国产色综合久久| 国内外成人免费激情在线视频| 国产精品久久久久久久午夜| 欧美剧在线免费观看网站| 久久免费视频在线观看| 久久久高清一区二区三区| 久久久精品国产免费观看同学| 先锋影音网一区二区| 欧美一区中文字幕| 久色成人在线| 欧美日韩国产成人精品| 欧美激情一区| 国产欧美短视频| 亚洲二区免费| 亚洲免费在线电影| 久久综合狠狠综合久久激情| 欧美激情 亚洲a∨综合| 亚洲激情影视| 性欧美精品高清| 欧美本精品男人aⅴ天堂| 欧美婷婷在线| 亚洲人体偷拍| 欧美在线免费| 一本大道久久a久久精品综合| 一区二区三区视频观看| 牛牛精品成人免费视频| 国产亚洲高清视频| 亚洲午夜电影| 亚洲片国产一区一级在线观看| 亚洲午夜在线观看视频在线| 久久久精品国产一区二区三区 | 一本一本大道香蕉久在线精品| 欧美一级二级三级蜜桃| 欧美系列亚洲系列| 亚洲精品永久免费精品| 另类激情亚洲| 噜噜噜久久亚洲精品国产品小说| 国产精品久久久久久久久免费 | 国产亚洲精品久久久| 午夜亚洲性色视频| 中国女人久久久| 欧美亚一区二区| 亚洲在线观看免费视频| 亚洲精品日产精品乱码不卡| 久久蜜桃av一区精品变态类天堂| 国产欧美日韩综合一区在线播放| 亚洲女爱视频在线| 亚洲在线观看视频| 国内外成人在线视频| 久久综合999| 欧美激情精品久久久| 中文一区在线| 欧美综合国产| 在线精品视频在线观看高清 | 久久久久久亚洲精品杨幂换脸 | 另类图片国产| 一本一本久久a久久精品牛牛影视| 亚洲国产婷婷| 国产九九精品| 欧美激情精品久久久久久大尺度| 免费看亚洲片| 欧美在线一区二区三区| 欧美精品成人91久久久久久久| 日韩亚洲欧美成人| 香蕉视频成人在线观看| 一本大道av伊人久久综合| 欧美一区国产一区| 99在线精品观看| 久久网站热最新地址| 亚洲欧美日韩成人| 欧美日韩综合精品| 亚洲第一在线视频| 好看的亚洲午夜视频在线| 亚洲毛片在线观看.| 怡红院av一区二区三区| 亚洲视屏在线播放| 亚洲一区二区三区在线| 欧美另类人妖| 亚洲精选中文字幕| 亚洲精品视频二区| 久久先锋资源| 欧美成人一区二区三区在线观看| 国产日韩欧美另类| 亚洲专区免费| 久久国产精品免费一区| 国产三区精品| 久热re这里精品视频在线6| 免费观看成人鲁鲁鲁鲁鲁视频| 狠狠色综合播放一区二区| 久久久久国产一区二区三区四区| 久久成人精品| 亚洲精品久久久久久一区二区| 久久综合给合| 日韩午夜黄色| 久久久精品日韩| 日韩一级黄色av| 国产精品专区第二| 免费不卡在线视频| 亚洲主播在线| 亚洲盗摄视频| 久久九九国产| 亚洲午夜在线观看| 激情久久久久| 国产精品欧美经典| 欧美成人午夜激情| 亚洲曰本av电影| 亚洲精品日产精品乱码不卡| 欧美中文字幕精品| 亚洲视频一区二区免费在线观看| 国产日韩免费| 国产精品日韩精品欧美精品| 欧美 日韩 国产 一区| 午夜在线a亚洲v天堂网2018| 亚洲人被黑人高潮完整版| 鲁大师影院一区二区三区| 欧美一区永久视频免费观看| 中文av一区二区| av成人激情| 亚洲私人黄色宅男| 一区二区三区成人| 一区二区三区你懂的| 在线亚洲精品| 亚洲天堂av在线免费| 亚洲一区自拍| 欧美一区二区视频免费观看| 亚洲欧美成aⅴ人在线观看| 亚洲一区激情| 久久久久国产免费免费| 久久只精品国产| 亚洲国产成人久久综合一区| 亚洲国产成人在线视频| 日韩一级片网址| 久久精品1区| 欧美凹凸一区二区三区视频| 欧美日韩不卡一区| 国产亚洲va综合人人澡精品| 国产一区二区三区四区老人| 亚洲欧洲另类| 欧美在线地址| av72成人在线| 久久综合久久综合这里只有精品 |