1. 程式人生 > >演算法導論 | 第25章 所有結點對的最短路徑問題

演算法導論 | 第25章 所有結點對的最短路徑問題

零、前言

前面講了單源最短路徑問題,指定一個原點一個終點,找到最短路徑。但是如果我們要求所有結點對呢?

方案一:可以對每一個結點呼叫一次單源最短路徑演算法,一共呼叫|V|次。(每指定一個原點,可以求出其他任何點到該原點的舉例)

對於權值為非負的圖,可以呼叫Dijkstra演算法,不同的優先佇列實現得到不同的時間複雜度:①線性陣列,O(V^3 + VE) = O(V^3)。②二叉堆,O(VElgV),在稀疏圖的情況下是一個較大的改進。③斐波那契堆,O(V^2lgV + VE)。

如果有權重為負的邊,就要使用Bellman-Ford演算法。時間複雜度為O(V^2E),在稀疏圖的情況下,時間為O(V^4)。

顯然上述方法時間複雜度較大,我們可以利用Floyd-Warshall演算法和Johnson演算法(用於稀疏圖)來求解。

Floyd-Warshall演算法用鄰接矩陣表示,Johnson演算法用鄰接表表示。

一、表示方式

1、權重的表示:


2、返回的是一個矩陣,dij表示從i結點到j結點的最短路徑權重。注意,dij和dji不一樣。為了能求出最短路徑,我們還要儲存父節點資訊,pij表示從i結點到j結點時,j的父節點的位置。那麼到時候通過修改22章的PRINT-PATH演算法就能得到想要的結果。


3、最短路徑和矩陣乘法

(1)利用動態規劃來分析,lij(m)為在結點i和結點j之間最多有m條邊的最小權重。而求lij(m)的時候利用lij(m-1)和在其中任意選一點k得到兩段權值之和的最小值進行比較,取最小值,即


那麼對於n個結點來說,求得lij(n-1)就已經達到了最優化,因此有


(2)自底向上實現

虛擬碼


通過對比矩陣乘法


兩者結構很相似,因此我們對最短路徑求解的時候,可以按照矩陣的方程來求解:L(n-1) = W(n-1)。主迴圈為:


時間複雜度為O(n^4)。

------->優化

對於矩陣或者數的n次方來說,可以通過重複平方的方法來講時間複雜度將為O(n^3 logN)。

又因為有公式


可以不用考慮越界問題,於是得到程式碼如下:


二、Floyd-Warshall演算法

這裡使用的動態演算法不是上面提到的那種,可以講時間複雜度壓縮到O(V^3)。上面的是按照從i到j的邊的個數來遞迴定義的。這裡是按照中間點的個數來定義的,其實質也差不多,但是遞迴的方式發生了變化。

從頂點vi到vj有一條長度為arcs[i][j]的路徑,但不一定是最短的,需要經過n次試探,中間節點依次從v0、v1....vn-1增加,步驟如下:

(1)先考察路徑(vi,v0,vj)師傅存在,如果存在比較(vi,vj)和(vi,v0)+(vi,vj)的大小,取最小值為,中間節點序號不大於0的最短路徑。

(2)再增加一個節點v1,判斷路徑(vi...v1)和(v1...vj)是否存在,注意,vi到v1和v1到vj之間的節點序號最多隻有v0一個,然後將二者的和與剛求得的新的(vi,vj)比較,取最小值更新。

(3)依次增加,比如增加節點k那麼判斷(vi....vk)+(vk...vj)之和的路徑值與最新的(vi,vj)比較取最小值更新。注意(vi....vk)和(vk...vj)之間的節點取值序號必須在0-- k-1之間。


遞迴公式為:


FLOYD-WARSHALL(W)
{
    n = W.rows;
    D0 = W;
    for(k = 1;k <= n;++k){
        let Dk = (dij(k))be a new n*n matrix;
        for i = 1 to n
            for j = 1 to n
                dij(k) = min(dij(k-1),dik(k-1)+dkj(k-1) )
    }
    return Dn;
}

構建一條最短路徑



三、用於稀疏圖的Johnson演算法

沒看太懂,詳細參考演算法導論P409

相關推薦

演算法導論 | 25 所有結點路徑問題

零、前言 前面講了單源最短路徑問題,指定一個原點一個終點,找到最短路徑。但是如果我們要求所有結點對呢? 方案一:可以對每一個結點呼叫一次單源最短路徑演算法,一共呼叫|V|次。(每指定一個原點,可以求出其他任何點到該原點的舉例) 對於權值為非負的圖,可以呼叫Dijkstra

結點路徑Floyd弗洛伊德演算法解析

        暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。         上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公

結點路徑之Floyd演算法原理詳解及實現

上兩篇部落格介紹了計算單源最短路徑的Bellman-Ford演算法和Dijkstra演算法。Bellman-Ford演算法適用於任何有向圖,即使圖中包含負環路,它還能報告此問題。Dijkstra演算法執行速度比Bellman-Ford演算法要快,但是其要求圖中不能包含負權重

所有節點路徑 超時 優先佇列 + dijkstra + 遍歷前驅子圖

Long long ago,there is a knight called JayYe.He lives in a small country.This country is made up of n cities connected by n-1 roads(that means it's a tree

資料結構實驗34——求賦權圖中一個結點所有結點路徑的長度

Description給一個賦權圖(無向圖),求0號結點到其餘所有結點的最短路徑的長度。Input先輸入一個小於等於100的正整數n,然後輸入賦權圖的鄰接矩陣(10000表示無窮大,並且任意一條簡單路徑

演算法導論25所有結點路徑問題)

25.1最短路徑和矩陣乘法 #include<iostream> using namespace std; #define n 20 int L[n][n],M[n][n]; typedef struct { int

演算法導論 十三:紅黑樹 筆記(紅黑樹的性質、旋轉、插入、刪除)

紅黑樹(red-black tree) 是許多“平衡的”查詢樹中的一種,它能保證在最壞情況下,基本的動態集合操作的時間為O(lgn) 。 紅黑樹的性質: 紅黑樹是一種二叉查詢樹,但在每個結點上增加一個儲存位表示結點的顏色,可以是RED或BLACK 。通過對任何一條從根到葉子的路徑上各個結

演算法導論 :快速排序 筆記(快速排序的描述、快速排序的效能、快速排序的隨機化版本、快速排序分析)

快速排序的最壞情況時間複雜度為Θ(n^2)。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能很好。它的期望執行時間複雜度為Θ(n lg n),而且Θ(n lg n)中蘊含的常數因子非常小,而且它還是原址排序的。 快速排序是一種排序演算法,對包含n個數的

演算法導論 :堆排序 筆記(堆、維護堆的性質、建堆、堆排序演算法、優先順序佇列、堆排序的程式碼實現)

堆排序(heapsort) 像合併排序而不像插入順序,堆排序的執行時間為O(nlgn) 。像插入排序而不像合併排序,它是一種原地( in place) 排序演算法:在任何時候,陣列中只有常數個元素儲存在輸入陣列以外。 堆: (二叉)堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。樹

演算法導論 :概率分析和隨機演算法 筆記(僱傭問題、指示器隨機變數、隨機演算法、概率分析和指示器隨機變數的進一步使用)

僱傭問題: 假設你需要僱用一名新的辦公室助理。你先前的僱傭嘗試都以失敗告終,所以你決定找一個僱用代理。僱用代理每天給你推薦一個應聘者。你會面試這個人,然後決定要不要僱用他。你必須付給僱用代理一小筆費用來面試應聘者。要真正地僱用一個應聘者則要花更多的錢,因為你必須辭掉目前的辦公室助理,還要付一

演算法導論 :遞迴式 筆記(代換法、遞迴樹方法、主方法、主定理的證明)

三種解遞迴式的方法:代換法、遞迴樹方法、主方法。 代換法: 用代換法解遞迴式需要兩個步驟: 猜測解的形式; 用數學歸納法找出使解真正有效的常數。 如: T(n) = 2T(n/2) + n,這個是合併排序的執行時間的遞迴表示式。歸併排序法的執行時間是O(nlgn),那麼我

演算法導論 :函式的增長 筆記(Θ記號、O記號、Ω記號、o記號、ω記號、漸近記號的性質、標準記號與常用函式)

Θ記號: 該記號圓圈中是個M。Θ記號漸近地給出一個函式的上界和下界。 對於一個給定的函式g(n),我們用Θ(g(n))來表示以下函式的集合: Θ(g(n))={f(n):存在正常量c1、c2和n0,使得對於所有n⩾n0,有0⩽c1g(n)⩽f(n)⩽c2g(n)}。 即若存在正常

2018/11/29 演算法時空(2) 演算法導論 函式的增長

漸進記號:   O記號:   歐米茄記號: 注意: O記號是複雜度函式的上限, 歐米茄記號是複雜度函式的下限. 等式/不等式漸進記號:  極限的定義: 通過極限的方法, 來求複雜度函式.   當極限的值是一個大於零

【學習筆記】演算法導論2演算法基礎

//====================================== //Ch2_1_Basic_Sort_Algorthm //====================================== #include<iostream> #

演算法導論 13 紅黑樹(圖文詳細解說)

1、二叉查詢樹的不足 二叉查詢樹的基本操作包括搜尋、插入、刪除、取最大和最小值等都能夠在O(h)(h為樹的高度)時間複雜度內實現,因此能在期望時間O(lgn)下實現,但是二叉查詢樹的平衡性在這些操作中並沒有得到維護,其高度可能會變得很高,當其高度較高時,二叉查詢樹的效能就未

演算法導論 10 10.2 連結串列

一、概念 (1)陣列的線性序是由陣列的下標決定的,連結串列中的順序是由各物件中的指標所決定的 (2)連結串列結點結構 node *prev; node *next; int key; (3)連結串列

演算法導論 18 B樹

一、定義 1、B樹 B樹是為磁碟或其它直接存取輔助儲存裝置而設計的一種平衡查詢樹,主要特點是降低磁碟I/O操作次數。 B樹以自然的方式推廣二叉查詢樹。 B樹的分支因子由磁碟特性所決定。  2、B數的資料結構 int n:當前儲存在結點x中的關鍵字數 key[N]:n個關鍵,

演算法導論12:二叉搜尋樹

基本性質 左子樹 < 根 < 右子樹 基本操作 O(logn) 1.查詢最大、最小關鍵字元素 根據二叉樹的基本性質,向左子樹或右子樹遞迴即可 2.查詢前驅和後繼 查詢結點X的後繼Y分為兩種情況: ①右結點存在,即只需要找到右子樹中最小的元素就好

演算法導論15習題答案

15.2-2 Q:請給出一個遞迴演算法MATRIX-CHAIN-MULTIPLY(A,s,i,j),使之在給出矩陣序列<A1,A2,...,An>,和由MATRIX-CHAIN-ORDER計算出的表s, 以及下標i和j後,能得出一個最有的矩陣鏈乘法。(初始呼叫為MATRIX-CHAIN-MULT

演算法導論 20 斐波那契堆

一、綜述1.斐波那契堆斐波那契堆是可合併堆在不涉及刪除的操作(除去EXTRACT和DELETE)中,操作僅需O(1)的平攤執行時間當EXTRACT和DELETE的運算元目較小時斐波那契堆能得到較好的執行效率。斐波那契堆不能有效地支援SEARCH操作用於解決諸如最小生成樹和尋找