之前學單源最短路徑的時候,學到狄克斯特拉演算法,我在想,如果對每個頂點都求它的單源最短路徑,那不就可以得到全點對之間的最短路徑了嗎?這樣算下來時間複雜度在o(|v|(|v|+|e|)log|v|)
但是,狄克斯特拉演算法有個問題,不能適用於權值為負數的邊,所以,當有權值為負數的邊的時候,需要用到弗洛伊德演算法。弗洛伊德演算法的時間複雜度為o(|v|3),其思想就是動態規劃的思想。
用a[i,j]來記錄從節點i到節點j的最短路徑。然後使用乙個中間節點k,對於i到j的最短路徑,有a[i][j] = min(a[i][j],a[i][k]+a[k][j])。其實就類似於在地圖軟體上面設定從起點到終點的路徑必須經過中間某個地點。k就是i到j當前路徑必須經過的節點。
通過上面的狀態轉移方程,就可以直接敲**了。
題目:grl_1_c
ac**:
#include #include #include using namespace std;
typedef long long ll;
#define maxv 105
#define maxe 9905
#define inf (1 << 21)
int v, e;
ll g[maxv][maxv];
void floyd()}}
}int main()
floyd();
bool is_negative_cycle = false;
for (int i = 0; i < e; ++i)
}if(is_negative_cycle)
{cout<
弗洛伊德演算法求最短路徑
include includeusing namespace std 鄰接矩陣的型別定義 define max 10000000 define max vertex num 20 typedef struct mgraph 構造有向網的鄰接矩陣 void createdn am mgraph g,i...
最短路徑 弗洛伊德 Floyd 演算法
弗洛伊德 floyd 演算法 是解決任意兩點間的最短路徑的一種演算法 floyd演算法是乙個經典的動態規劃演算法 用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋 這個詮釋正是動態規劃最富創造力的精華所在 從任意節點i到任意...
最短路徑基礎演算法 弗洛伊德
問題 a 1171 基礎演算法 最短路徑問題 時間限制 1 sec 記憶體限制 64 mb 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找...