floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法。
本文給出一種floyd演算法的c++實現。 此演算法支援點和邊的動態輸入,並提供介面說明
int** d = null; //二維陣列,儲存任意兩點最短路徑的權值之和
int** path = null; //二維陣列,儲存任意兩點之間的最短路徑
int matrixsize = 0;//圖中頂點的個數
int arcsize = 0;//圖中邊的個數
int isdigraph = 0;//圖的型別,是有向圖還是無向圖
定義以下介面:
/*初始化儲存結構
vertexnum: 頂點的個數
arcnum:邊的個數*/
bool init(int vertexnum, int arcnum)
/*新增一條邊
start: 邊的起點
end:邊的終點
weight: 邊的權重*/
bool addarc(int start, int end, int weight, bool isdigraph = false)
/*計算所有頂點之間的最短路徑*/
bool calculatepath()
/*返回兩個點之間的最短路徑
start: 路徑的起點
end:路徑的終點*/
bool getshortestpath(int start, int end)
#include
#include
#include
#define max 10000000
int** d = null;
int** path = null;
int matrixsize = 0;
int arcsize = 0;
int isdigraph = 0;
bool init(int vertexnum, int arcnum)
}path = (int**)malloc(vertexnum * sizeof(int*));
memset(path, 0, vertexnum * sizeof(int*));
for(int i = 0; i < vertexnum; i++)
}return true;
}bool addarc(int start, int end, int weight, bool isdigraph = false)
else
}bool calculatepath()
bool getshortestpath(int start, int end)
printf("%d\n",en);
return true;
}else if( (start!=end) && (d[start][end] >= max))
return false;
}int main()
}return 0;
}
弗洛伊德(Floyd)演算法
弗洛伊德 floyd 演算法過程 用d v w 記錄每一對頂點的最短距離。依次掃瞄每乙個點,並以其為基點再遍歷所有每一對頂點d的值,看看是否可用過該基點讓這對頂點間的距離更小。演算法理解 最短距離有三種情況 兩點的直達距離最短。如下圖 兩點間只通過乙個中間點而距離最短。圖 兩點間用通過兩各以上的頂點...
弗洛伊德 Floyd 演算法
和dijkstra演算法一樣,弗洛伊德 floyd 演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名 弗洛伊德演算法 floyd 計算圖中各個頂點之間的最短路徑 迪傑斯特拉演算法用於計算圖中某乙...
弗洛伊德 Floyd 演算法
佛羅依德 floyd 演算法的基本思想 設圖g用鄰接矩陣法表示,求圖g中任意一對頂點vi與vj間的的最短路徑。1 將vi到vj的最短的路徑長度初始化為g.arcs i j adj,進行如下n次比較和修正 0 在vi與vj間加入頂點v0,比較 vi,v0,vj 和 vi,vj 的路徑的長度,取其中較短...