• <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>

            Just enjoy programming

            最短路徑

            (一)迪杰斯特拉算法(時間復雜度O(n2))
                   迪杰斯特拉(Dijkstra)算法是求某個源點到其余各頂點的最短路徑,這是一個按路徑長度遞增的次序產生最短路徑的算法。
                   首先引進一個輔助向量D,它的每個分量D[i]表示當前所找到的從始點v到每個終點vi的最短路徑的長度。它的初態為:若從v到vi有弧,則D[i]為弧上的權值;否則置D[i]為無窮大。顯然,長度為D[j]=Min{D[i]|vi屬于V}的路徑就是從v出發的長度最短的一條最短路徑。因此,在一般情況下,下一條長度次短的最短路徑的長度必為D[j]=Min{D[i]|vi 屬于 V-S} 其中D[i]或者為弧(v,vi)上的權值,或者是D[k](vk屬于S)和弧(vk,vi)上的權值之和。算法步驟如下:
            (1)假設用帶權的鄰接矩陣arcs來表示帶權有向圖,arcs[i][j]表示弧(vi,vj)上的權值。若(vi,vj)不存在,則置arcs[i][j]為無窮大。S為已找到從v出發的最短路徑的終點的集合,它的初始狀態為空集。那么,從v出發到圖上其余各頂點(終點)vi,可能達到的最短路徑長度的初值為:
            D[i]=G.arcs[v][vi],vi屬于V
            (2)選擇Vj,使得
               D[j]=Min{D[i]|vi 屬于V-S}
            vj 就是當前求得的一條從v出發的最短路徑的終點。令
               S=SU {j}
            (3)   修改從v出發到集合V-S上任一頂點vk可達的最短路徑長度。如果D[j]+arcs[j][k]<D[k]則修改D[k]為 D[k]=D[j]+arcs[j][k]
            (4) 重復操作(2),(3)共 n-1次。由此求得從v到圖上其余各頂點的最短路徑是依路徑長度遞增的序列。

            (二)弗洛伊德(Floyd)算法(時間復雜度為O(n3))
            弗洛伊德(Floyd)算法是求圖中每一對頂點之間的最短路徑,時間復雜度為O(n3).
            弗洛伊德算法仍從圖的帶權鄰接矩陣cost出發,其基本思想是 :
            假設求從頂點vi到vj的最短路徑。如果從vi到vj有弧,則從vi到vj存在一條長度arcs[i][j]的路徑,該路徑不一定是最短路徑,尚需進行n次試探。首先考慮路徑(vi,v0,vj)是否存在(即判別弧(vi,v0)和(v0,vj)是否存在)。 如果存在,則比較(vi,vj)和(vi,v0,vj)是否存在(即判別弧(vi,v0)和(v0,vj)是否存在).如果存在,則比較(vi,vj)和(vi,v0,vj)的路徑長度取長度較短者為從vi到vj的中間頂點的序號不大于0的最短路徑。假如在路徑上再增加一個頂點v1,也就是說,如果(vi,...v1)和(v1...vj)分別為當前找到的中間頂點的序號不大于0的最短路徑,那么(vi,...,v1,...vj)就有可能是從vi到vj的中間頂點的序號不大于1的最短路徑。將它和已經得到的從vi到vj中間的頂點序號不大于0的最短路徑相比較,從中選出中間頂點的序號不大于1的最短路徑之后,再增加一個頂點v2,繼續進行試探。依次類推。在一般情況下,若(vi,...,vk)和(vk,...vj)分別是從vi到vk和從vk到vj的中間頂點的序號不大于k-1的最短路徑,則將(vi,...vk,...vj)和已經得到的從vi到vj且中間頂點序號不大于k-1的最短路徑相比較,其長度較短者便是從vi到vj的中間頂點的序號不大于k的最短路徑。這樣,在經過n次比較后,最后求得的必是從vi到vj的最短路徑。
            現定義一個n階方陣序列
            D(-1),D(0),D(1),...D(k),...D(n-1)
            其中
            D(-1)[i][j]=G.arcs[i][j].
            D(k)[i][j]=Min{D(k-1)[i][j],D(k-1)[i][k]+D(k-1)[k][j]}  0<=k<=n-1
            從上述計算公式可見,D(1)[i][j]是從vi到vj的中間頂點的序號不大于1的最短路徑的長度。D(k)[i][j]是從vi到vj的中間頂點的序號不大于k的最短路徑的長度。D(n-1)[i][j]就是從vi到vj的最短路徑的長度。

            posted on 2011-05-19 16:44 周強 閱讀(501) 評論(2)  編輯 收藏 引用 所屬分類: 算法

            評論

            # re: 最短路徑 2011-05-25 20:48 十三

            好熟的名字~
            俺好像學過~~  回復  更多評論   

            # re: 最短路徑 2011-05-25 23:20 周強

            @十三
            恩,經典兩個算法  回復  更多評論   

            天天爽天天爽天天片a久久网| 欧洲国产伦久久久久久久| 久久人人爽人人人人爽AV| 无码任你躁久久久久久老妇App| 亚洲午夜久久久久久久久电影网| 无码国内精品久久人妻| 国产成人精品久久一区二区三区av| 久久久噜噜噜久久| 久久亚洲春色中文字幕久久久| 91精品无码久久久久久五月天| 久久亚洲AV成人无码软件| 国产99久久精品一区二区| 少妇被又大又粗又爽毛片久久黑人| 亚洲av日韩精品久久久久久a| 大美女久久久久久j久久| 少妇久久久久久久久久| 日韩十八禁一区二区久久| 国产成人精品久久二区二区| 久久久久高潮综合影院| 精品久久久无码中文字幕| 成人妇女免费播放久久久| 久久久久av无码免费网| 久久久久久国产精品美女| 久久这里只有精品首页| 嫩草伊人久久精品少妇AV| 综合人妻久久一区二区精品| 色播久久人人爽人人爽人人片aV | 国产精品久久网| 97精品依人久久久大香线蕉97 | 久久精品?ⅴ无码中文字幕| 国产精品国色综合久久| 亚洲精品国产字幕久久不卡| 日本WV一本一道久久香蕉| 人妻丰满?V无码久久不卡| 一本一道久久精品综合| 精品久久香蕉国产线看观看亚洲 | 精品国产青草久久久久福利 | 久久精品国产99久久香蕉| 国产99久久九九精品无码| 国产69精品久久久久9999| 亚洲综合久久综合激情久久|