/*
*求有向網中的任意兩點的最短路徑
*弗洛伊德演算法的核心是 運用乙個path二維陣列 和乙個a二維陣列
*path陣列用來儲存中間路徑經過的節點
*a陣列用來儲存任意兩個頂點之間的最短路徑長度
*最後輸出a陣列運用了遞迴輸出的思想
*先初始化path陣列和a陣列
*運用三層迴圈 (演算法的核心) 計算任意兩點之間的最短路徑長度 將經過的節點的下標儲存在path陣列中去
*遞增的思想
*建立乙個有向網 輸出乙個臨接矩陣
*/
#include#include#include#define ok 1
#define error 0
#define vertexnum 100//最大頂點數
#define name_size 255//字串的最大長度
#define max_int 32726 //權重最大值
typedef int statu;//返回值的資料型別
typedef char*vertextype;//字串的資料型別
typedef int arctype;//權值陣列的資料型別
typedef struct amgraph
amgraph;//圖的結構體
int path[vertexnum][vertexnum];//用於儲存進過的中間路徑的節點的下標
int a[vertexnum][vertexnum];//經過的路徑節點的權值
void main()
void test();//測試函式
statu create_dn(amgraph*g);//建立有向網
int locate_vex(amgraph*g,vertextype vex);//定位函式
void floyed_function(amgraph*g);//弗洛伊德演算法
void dispath(int a[vertexnum],int path[vertexnum],int n);
//n代表當前圖的頂點數
//最短路徑第一輸出函式 主要用於輸出權值
void ppath(int path[vertexnum],int i,int j);//用於輸出路徑節點的下標
//建立乙個有向網
statu create_dn(amgraph*g)//建立有向網
//初始化權值陣列
for(i=0;iarcs[i][j]=max_int;//權值初始化
}//初始化邊的資訊
for(i=0;ie;i++)
else
}return ok;
}int locate_vex(amgraph*g,vertextype vex)
else
}return (index==g->n ? -1 : index);
}void floyed_function(amgraph*g)//弗洛伊德演算法
//演算法的核心 三層迴圈
for(k=0;kn;k++)
for(i=0;in;i++)
for(j=0;jn;j++)
if(a[i][j]>a[i][k]+a[k][j])
dispath(a,path,g->n);//輸出任意兩個鄰接點的最短路徑長度
}void ppath(int path[vertexnum],int i,int j)//輸出最短路徑經過的中間節點
else
}void dispath(int a[vertexnum],int path[vertexnum],int n)//依次輸出最短路徑的權值
}}void test()
else//輸出鄰接矩陣
printf("\n");//換行輸出
//輸出邊的資訊
for(i=0;in;i++)
printf("\n");//換行}}
printf("\n");
printf("最短路徑及其經過的節點為:\n");
floyed_function(g);
}
資料結構 弗洛伊德演算法
複習一下floyd演算法,實現很簡單,3個for迴圈,每一層迴圈的意思需要深刻的理解 推薦這片部落格 有該演算法的詳細解釋 2017.3.1 我下面的 有很明顯的缺點,所有的改動都是在原有的儲存矩陣之上,如果需要對原圖進行其他分析,需要複製乙個矩陣,對後者進行改動,傳遞至floyd函式內的引數不應為...
資料結構與演算法 26 弗洛伊德演算法
設定頂點vi到頂點vk的最短路徑已知lik,頂點vk到vj的最短路徑已知為lkj,頂點vi到vj的路徑為lij,則vi到vj的最短路徑為 min lik lkj lij vk的取值為圖中所有頂點,則可獲得vi到vj的最短路徑 至於vi到vk的最短路徑lik或者vk的最短路徑lkj,是以同樣的方式獲得...
C語言資料結構與演算法 最短路徑(弗洛伊德演算法)
方法一 每次以乙個頂點為源點,重複執行迪傑斯特拉演算法 n 次 方法二 使用弗洛伊德演算法 兩種方法的時間複雜度相同都為 n 3,但是弗洛伊德演算法卻更為簡單 步驟 初始時設定乙個 n 階方陣,令其對角線元素為 0,若存在弧,則對應元素為權值 否則為 逐步試著在原直接路徑中增加中間頂點,若加入中間頂...