圖 - 每對頂點間最短路徑----Floyd演算法
對於一個各邊權值均大於零的有向圖,對每一對頂點,求出vi與vj之間的最短路徑和最短路徑長度。
以下程式碼包含有向圖的建立,Floyd演算法的實現以及輸出最短路徑和最短路徑長度。
程式碼說明幾點:
1、A[][]陣列初始化為各頂點間的原本距離,最後儲存各頂點間的最短距離。
2、path[][]陣列儲存最短路徑,與當前迭代的次數有關。初始化都為-1,表示沒有中間頂點。在求A[i][j]過程中,path[i][j]存放從頂點vi到頂點vj的中間頂點編號不大於k的最短路徑上前一個結點的編號。在演算法結束時,由二維陣列path的值回溯,可以得到從頂點vi到頂點vj的最短路徑。
初始化A[][]陣列為如下,即有向圖的鄰接矩陣。
完整的實現程式碼如下:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
#define MaxVertexNum 100
#define INF 32767
typedef struct
{
char vertex[MaxVertexNum];
int edges[MaxVertexNum][MaxVertexNum];
int n,e;
}MGraph;
void CreateMGraph(MGraph &G)
{
int i,j,k,p;
cout<<"請輸入頂點數和邊數:";
cin>>G.n>>G.e;
cout<<"請輸入頂點元素:";
for (i=0;i<G.n;i++)
{
cin>>G.vertex[i];
}
for (i=0;i<G.n;i++)
{
for (j=0;j<G.n;j++)
{
G.edges[i][j]=INF;
if (i==j)
{
G.edges[i][j]=0;
}
}
}
for (k=0;k<G.e;k++)
{
cout<<"請輸入第"<<k+1<<"條弧頭弧尾序號和相應的權值:";
cin>>i>>j>>p;
G.edges[i][j]=p;
}
}
void Dispath(int A[][MaxVertexNum],int path[][MaxVertexNum],int n);
void Floyd(MGraph G)
{
int A[MaxVertexNum][MaxVertexNum],path[MaxVertexNum][MaxVertexNum];
int i,j,k;
for (i=0;i<G.n;i++)
{
for (j=0;j<G.n;j++)
{
A[i][j]=G.edges[i][j];
path[i][j]=-1;
}
}
for (k=0;k<G.n;k++)
{
for (i=0;i<G.n;i++)
{
for (j=0;j<G.n;j++)
{
if (A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
}
Dispath(A,path,G.n);
}
void Ppath(int path[][MaxVertexNum],int i,int j)
{
int k;
k=path[i][j];
if (k==-1)
{
return;
}
Ppath(path,i,k);
printf("%d",k);
Ppath(path,k,j);
}
void Dispath(int A[][MaxVertexNum],int path[][MaxVertexNum],int n)
{
int i,j;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if (A[i][j]==INF)
{
if (i!=j)
{
printf("從%d到%d沒有路徑/n",i,j);
}
}
else
{
printf(" 從%d到%d=>路徑長度:%d路徑:",i,j,A[i][j]);
printf("%d,",i);
Ppath(path,i,j);
printf("%d/n",j);
}
}
}
}
int main()
{
MGraph G;
CreateMGraph(G);
Floyd(G);
return 0;
}
之前在我新浪部落格的文章~
相關文章
- 最短路徑(Floyd演算法)演算法
- 最短路徑之Floyd演算法演算法
- [MATLAB]最短路徑Floyd演算法Matlab演算法
- Floyd演算法(計算最短路徑)演算法
- 求最短路徑——DFS+Floyd演算法演算法
- 多源最短路徑演算法:Floyd演算法演算法
- 最短路徑——Dijkstra演算法和Floyd演算法演算法
- 最短路徑—Dijkstra演算法和Floyd演算法演算法
- 最短路徑——floyd演算法程式碼(c語言)演算法C語言
- Floyd最短路演算法演算法
- 多源最短路徑,一文搞懂Floyd演算法演算法
- 單源最短路徑複習--Dijkstra演算法和Floyd演算法演算法
- 求兩點之間最短路徑-Dijkstra演算法演算法
- 最短路徑--dijkstra演算法、弗洛伊德(Floyd)演算法(帶路徑輸出)演算法
- 最短路-SPFA演算法&Floyd演算法演算法
- 最短路演算法之:floyd 演算法演算法
- 最短路-Floyd
- 【最短路徑Floyd演算法詳解推導過程】看完這篇,你還能不懂Floyd演算法?還不會?演算法
- 圖的最短路徑演算法彙總演算法
- 最短路徑演算法演算法
- 最短路演算法詳解(Dijkstra/SPFA/Floyd)演算法
- 圖的單源最短路徑(Dijkstra演算法)演算法
- Djikstra最短路徑演算法演算法
- 【圖論】Floyd演算法圖論演算法
- 最短路徑(Dijskra演算法)JS演算法
- 最短路徑演算法總結演算法
- 演算法:最短路徑問題演算法
- POJ 2240 Arbitrage(Floyd最短路)
- 演算法與資料結構之-圖的最短路徑演算法資料結構
- 幾個最短路徑的演算法演算法
- 最短路徑之Dijkstra演算法演算法
- SQL Server與最短路徑演算法SQLServer演算法
- 《圖論》——最短路徑 Dijkstra演算法(戴克斯特拉演算法)圖論演算法
- 最短路徑問題 (dijkstra演算法)演算法
- 單源最短路徑-Dijkstra演算法演算法
- 單源最短路徑 -- Dijkstra演算法演算法
- 《啊哈!演算法》第6章最短路徑演算法
- Python 圖_系列之縱橫對比 Bellman-Ford 和 Dijkstra 最短路徑演算法Python演算法