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

隨筆 - 70  文章 - 160  trackbacks - 0

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

常用鏈接

留言簿(8)

隨筆檔案

文章檔案

搜索

  •  

積分與排名

  • 積分 - 180440
  • 排名 - 147

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

相關(guān)文章:

1.Dijkstra算法:

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

2.Floyd算法:

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

Dijkstra算法是處理單源最短路徑的有效算法,但它局限于邊的權(quán)值非負(fù)的情況,若圖中出現(xiàn)權(quán)值為負(fù)的邊,Dijkstra算法就會(huì)失效,求出的最短路徑就可能是錯(cuò)的。這時(shí)候,就需要使用其他的算法來(lái)求解最短路徑,Bellman-Ford算法就是其中最常用的一個(gè)。該算法由美國(guó)數(shù)學(xué)家理查德•貝爾曼(Richard Bellman, 動(dòng)態(tài)規(guī)劃的提出者)和小萊斯特•福特(Lester Ford)發(fā)明。Bellman-Ford算法的流程如下:
給定圖G(V, E)(其中V、E分別為圖G的頂點(diǎn)集與邊集),源點(diǎn)s,

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

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

首先介紹一下松弛計(jì)算。如下圖:


 

松弛計(jì)算之前,點(diǎn)B的值是8,但是點(diǎn)A的值加上邊上的權(quán)重2,得到5,比點(diǎn)B的值(8)小,所以,點(diǎn)B的值減小為5。這個(gè)過(guò)程的意義是,找到了一條通向B點(diǎn)更短的路線,且該路線是先經(jīng)過(guò)點(diǎn)A,然后通過(guò)權(quán)重為2的邊,到達(dá)點(diǎn)B。
當(dāng)然,如果出現(xiàn)一下情況


 

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

經(jīng)過(guò)第一次遍歷后,點(diǎn)B的值變?yōu)?,點(diǎn)C的值變?yōu)?,這時(shí),注意權(quán)重為-10的邊,這條邊的存在,導(dǎo)致點(diǎn)A的值變?yōu)椋?。(8+ -10=-2)
 
 

第二次遍歷后,點(diǎn)B的值變?yōu)?,點(diǎn)C變?yōu)?,點(diǎn)A變?yōu)椋?。正是因?yàn)橛幸粭l負(fù)邊在回路中,導(dǎo)致每次遍歷后,各個(gè)點(diǎn)的值不斷變小。
 
在回過(guò)來(lái)看一下bellman-ford算法的第三部分,遍歷所有邊,檢查是否存在d(v) > d (u) + w(u,v)。因?yàn)榈诙糠盅h(huán)的次數(shù)是定長(zhǎng)的,所以如果存在無(wú)法收斂的情況,則肯定能夠在第三部分中檢查出來(lái)。比如
 

此時(shí),點(diǎn)A的值為-2,點(diǎn)B的值為5,邊AB的權(quán)重為5,5 > -2 + 5. 檢查出來(lái)這條邊沒(méi)有收斂。
 
所以,Bellman-Ford算法可以解決圖中有權(quán)為負(fù)數(shù)的邊的單源最短路徑問(wèn)。

個(gè)人感覺(jué)算法導(dǎo)論講解很不錯(cuò),把這一章貼出來(lái)和大家分享:

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;    // 起點(diǎn),重點(diǎn)
    int weight;  // 邊的權(quán)值
}Edge;
 
Edge edge[maxnum];     
// 保存邊的值
int  dist[maxnum];     // 結(jié)點(diǎn)到源點(diǎn)最小距離
 
int nodenum, edgenum, source;    // 結(jié)點(diǎn)數(shù),邊數(shù),源點(diǎn)
 
// 初始化圖
void init()
{
    
// 輸入結(jié)點(diǎn)數(shù),邊數(shù),源點(diǎn)
    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)          //注意這里設(shè)置初始情況
            dist[edge[i].v] = edge[i].weight;
    }
}
 
// 松弛計(jì)算
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;
    
// 判斷是否有負(fù)環(huán)路
    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) 評(píng)論(2)  編輯 收藏 引用

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

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
              一本久道综合久久精品| 一本色道久久综合| 一区二区三区在线观看视频| 亚洲人成绝费网站色www| 久久频这里精品99香蕉| 亚洲精品免费在线播放| 久久xxxx| 国产美女高潮久久白浆| 亚洲综合欧美| 在线一区二区日韩| 欧美视频导航| 亚洲永久免费av| 一区二区三区久久精品| 欧美日韩国产高清| 亚洲丝袜av一区| 日韩一级精品视频在线观看| 欧美久久婷婷综合色| 99国产精品私拍| 亚洲日本中文字幕| 欧美全黄视频| 亚洲综合好骚| 欧美一区二区三区在线观看| 国产主播一区| 欧美a级片网站| 欧美激情偷拍| 亚洲视频在线视频| 亚洲欧美日韩一区二区在线 | 国产精品自拍在线| 亚洲自拍偷拍色片视频| 亚洲综合首页| 国产综合久久久久久鬼色| 久久久999成人| 久久人人爽人人爽爽久久| 亚洲欧洲综合另类| 日韩视频在线一区二区| 国产欧美日韩在线观看| 蜜桃av综合| 欧美日韩人人澡狠狠躁视频| 欧美在线资源| 欧美成人精品影院| 校园激情久久| 欧美 日韩 国产在线 | 亚洲欧美999| 在线看成人片| 99精品欧美一区| 国产视频一区在线观看| 欧美激情无毛| 国产精品欧美在线| 欧美黑人国产人伦爽爽爽| 国产精品九九| 欧美激情精品久久久久久久变态| 欧美调教vk| 欧美黑人在线观看| 国产日韩精品入口| 亚洲精品视频在线观看网站| 国产亚洲欧美一区二区| 91久久午夜| 国模私拍一区二区三区| 亚洲免费激情| 亚洲国产另类 国产精品国产免费| 一区二区三区欧美日韩| 在线成人激情黄色| 亚洲在线观看免费| 99国内精品| 久久综合伊人77777蜜臀| 校园春色综合网| 欧美日韩国产片| 欧美v日韩v国产v| 国产午夜精品久久| 亚洲色无码播放| 99精品99| 欧美成人精品| 免费人成网站在线观看欧美高清| 国产精品草草| 亚洲精品一区二区三区av| 精品不卡一区| 欧美一区二区黄| 欧美一区免费视频| 国产精品久久久久久久久免费| 亚洲国产色一区| 亚洲激情在线| 久久综合网络一区二区| 看欧美日韩国产| 国产一本一道久久香蕉| 亚洲制服欧美中文字幕中文字幕| 一本到高清视频免费精品| 老司机久久99久久精品播放免费| 影音欧美亚洲| 欧美一区二区精品| 欧美日韩福利| 亚洲激情自拍| 亚洲毛片一区二区| 欧美高清视频一区二区| 亚洲福利视频免费观看| 亚洲福利视频二区| 久久天天躁狠狠躁夜夜av| 久久亚洲综合| 亚洲大胆视频| 欧美 亚欧 日韩视频在线| 亚洲夫妻自拍| 99re热这里只有精品免费视频| 欧美福利一区二区| 亚洲精品色图| 亚洲一品av免费观看| 国产精品精品视频| 亚洲一区二区三| 久久精品91久久久久久再现| 国产一区二区精品在线观看| 久久成人综合视频| 欧美成人在线免费观看| 亚洲精品网址在线观看| 欧美人成在线| 亚洲一二三区在线观看| 久久成人免费电影| 在线看日韩av| 欧美日韩八区| 亚洲欧美日韩高清| 美国十次了思思久久精品导航| 亚洲国产欧美一区二区三区丁香婷| 欧美激情综合| 亚洲欧美视频在线| 欧美v国产在线一区二区三区| 99视频热这里只有精品免费| 国产精品裸体一区二区三区| 久久精品国产免费观看| 亚洲国产欧美一区二区三区久久| 一区二区三区国产| 国产午夜精品麻豆| 欧美成人精品影院| 亚洲欧美日韩综合国产aⅴ| 欧美xart系列高清| 亚洲欧美日韩电影| 亚洲二区在线视频| 国产精品福利在线观看| 久久九九免费视频| 正在播放亚洲一区| 欧美激情片在线观看| 欧美亚洲免费电影| 99精品欧美一区二区三区| 黄色一区二区在线观看| 国产精品国产亚洲精品看不卡15 | 久久噜噜亚洲综合| 一本色道久久综合亚洲精品不| 国产精品成人一区二区三区夜夜夜| 亚洲一区在线视频| 亚洲黄色免费网站| 欧美一区二区在线看| 亚洲精选91| 激情综合久久| 国产精品视频yy9099| 欧美精品久久99久久在免费线| 欧美在线影院| 一区二区成人精品| 亚洲国产美女| 久久免费视频观看| 午夜日韩电影| 亚洲视频免费观看| 亚洲人精品午夜| 欧美激情一区三区| 久久国产精品一区二区| 一区二区三区欧美成人| 美女主播一区| 欧美伊人久久| 亚洲欧美国产精品桃花| 9人人澡人人爽人人精品| 亚洲国产精品va在线观看黑人| 久久婷婷av| 久久精品二区三区| 小处雏高清一区二区三区| 亚洲欧美国产精品专区久久| 亚洲国产精品悠悠久久琪琪| 加勒比av一区二区| 狠狠爱综合网| 国产一区二区av| 国产一区二区三区黄视频| 国产嫩草一区二区三区在线观看| 国产精品久久二区二区| 国产精品国码视频| 国产精品久久999| 国产精品午夜视频| 国产伦精品一区二区三区视频黑人 | 在线一区二区三区做爰视频网站| 亚洲欧洲日产国码二区| 亚洲美女色禁图| 一区二区免费在线观看| 亚洲一区亚洲| 欧美亚洲网站| 久久免费一区| 欧美激情一区在线| 欧美视频日韩视频在线观看| 欧美午夜一区二区| 国产视频一区在线观看| 在线成人激情黄色| 亚洲最新在线视频| 亚洲一区二区三区中文字幕| 性欧美xxxx大乳国产app| 久久蜜桃精品| 亚洲高清av| 亚洲视频在线看| 久久成人综合视频|