求全源最短路徑可以採用單源最短路徑演算法實現,如採用貪心演算法的dijkstra,時間開銷為|v|*o(e+vlgv),動態規劃的bellman-ford, |v|*o(v pow 2 *e),還有bellman的優化演算法spfa。但是呢,這樣無疑會在時間開銷上花費昂貴。
假設我們採用bellman-ford演算法,
for (int i = 1; i < numofvertex; i ++) //這裡迴圈從1開始是因為開始節點已經存放在s中了,還有numofvertex-1個節點要處理
}
}
} }
看看矩陣的乘法:
for(i=0;i<
this
->m;i++)
for(j=0;j
} 那麼如果要用floyd求全源最短路徑可以加上乙個for迴圈,內部的可以定義為矩陣乘法的結構。
floyd演算法可以說是warshall演算法的擴充套件,三個for迴圈就可以解決問題,所以它的時間複雜度為o(n^3)。
floyd演算法的基本思想如下:從任意節點a到任意節點b的最短路徑不外乎2種可能,1是直接從a到b,2是從a經過若干個節點x到b。所以,我們假設dis(ab)為節點a到節點b的最短路徑的距離,對於每乙個節點x,我們檢查dis(ax) + dis(xb) < dis(ab)是否成立,如果成立,證明從a到x再到b的路徑比a直接到b的路徑短,我們便設定dis(ab) = dis(ax) + dis(xb),這樣一來,當我們遍歷完所有節點x,dis(ab)中記錄的便是a到b的最短路徑的距離。
但是這裡我們要注意迴圈的巢狀順序,如果把檢查所有節點x放在最內層,那麼結果將是不正確的,為什麼呢?因為這樣便過早的把i到j的最短路徑確定下來了,而當後面存在更短的路徑時,已經不再會更新了。
給出如下的**:
#include #include #include #include using namespace std;
int map[6] = ,
,
,
,
,
};
void dijkstra(
const int numofvertex, /*節點數目*/
const int startvertex, /*源節點*/
int (map)[6], /*有向圖鄰接矩陣*/
int *distance, /*各個節點到達源節點的距離*/
int *prevvertex /*各個節點的前乙個節點*/
)
prevvertex[ startvertex ] = -1; //源節點無前乙個節點
/*開始使用貪心思想迴圈處理不在s集合中的每乙個節點*/
isins[startvertex] = true; //開始節點放入s集合中
int currentvertex = startvertex;
for (int i = 1; i < numofvertex; i ++) //這裡迴圈從1開始是因為開始節點已經存放在s中了,還有numofvertex-1個節點要處理
}
isins[currentvertex] = true;//將這個節點currentvertex放入s集合中
//step3
/*對這個新的currentvertexc做鬆弛計算,更新distance*/
for (int j =0; j < numofvertex; j ++)
}
}
}
}
void display(int (arr)[6], int numofvertex)
cout << "路徑:";
即5到節點0之間的距離為無窮。很明顯的知道0到5的距離是9,由於這是無向圖,5到0的距離也是9,所以將k迴圈兩圈,及c<1改為c<2讓他可以來的及更新值,得到如下的結果:
Floyd演算法 多源最短路徑
解決稠密圖較好 準備工作 include floyd演算法解決稠密圖時更好 include include include using namespace std const int maxv 100 定義邊 typedef struct enode edge 定義鄰接矩陣儲存的圖 typedef ...
Floyd 演算法求多源最短路徑
floyd演算法 floyd演算法用來找出每對頂點之間的最短距離,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 可根據最小環的正負來判定 基本演算法 floyd演算法基於動態規劃的思想,以 u 到 v 的最短路徑至少經過前 k 個點為轉移狀態進行計算,通過 k 的增加...
Floyd 演算法求多源最短路徑
floyd演算法 floyd演算法用來找出每對頂點之間的最短距離,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環 可根據最小環的正負來判定 基本演算法 floyd演算法基於動態規劃的思想,以 u 到 v 的最短路徑至少經過前 k 個點為轉移狀態進行計算,通過 k 的增加...