Floyd algorithm!!!!!(萬惡的弗洛伊德演算法)
阿新 • • 發佈:2019-01-07
曾經有位滑稽的博主說過:搜尋就是優雅的暴力。今天他又要說,DP就是優雅地搜尋。
不是每一個弗洛伊德都寫演算法,也不是寫演算法的都叫弗洛伊德,還有一位人家寫性學三論去了。
這位弗洛伊德來歷不一般,斯坦福大學的教授,1978年的圖靈獎就發給人家了,這麼一個很牛的弗洛伊德。
基本思想就是DP,開個二維陣列來找最短路辣~
缺點就是因為要開二維陣列所以就是容易報記憶體錯誤,比如陣列開的太大辣,或者執行出錯啊之類的。
優點就是,思路簡單。
言歸正傳,弗洛伊德演算法的基本思路,如果說我們從A到B點時,經歷一個C點可以使路徑或者時間更短的話就從這裡中轉,然後嘗試再加一箇中轉點,再加一個,再加一個,不停地加下去,直到所有可能都已經列舉。
優雅的搜尋。
所以這個東西我感覺沒有什麼講頭給泥萌直接上程式碼辣OVO:
#include<stdio.h> #include<string.h> #define inf 0x3f3f3f3f//假定無窮大 #define maxn 1000//問題規模 int dis[maxn][maxn];//問題陣列,dis[i][j]代表點i到j的距離 int main() { int n; scanf("%d", &n); memset(dis, inf, sizeof(dis));//在不知道點的距離的時候就預設所有點之間都是無窮大 int a, b,c; while (n--)//首先輸入幾個已知點之間的距離 { scanf("%d %d %d", a, b, c); dis[a][b] = dis[b][a] = c;//這裡預設用無向圖 } for (int k = 0 ; k < maxn; k++)//Floyd演算法 { for (int i = 0; i < maxn; i++) { for (int j = 0; j < maxn; j++) { dis[i][j] = dis[i][j] <= dis[i][k] + dis[k][j] ? dis[i][j] : dis[i][k] + dis[k][j];//DP!!!!!!!!!!! } } } int t; scanf("%d", &t);//T次詢問辣~ while (t--) { scanf("%d %d", &a, &b); printf("%d\n", dis[a][b]); } return 0; }
喜歡別忘記點贊!QAQ