C語言資料結構弗洛伊德演算法 求兩點之間最短路徑長度

2021-09-24 04:12:22 字數 2035 閱讀 2825

/*

*求有向網中的任意兩點的最短路徑

*弗洛伊德演算法的核心是 運用乙個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,若存在弧,則對應元素為權值 否則為 逐步試著在原直接路徑中增加中間頂點,若加入中間頂...