演算法:最短路徑之弗洛伊德(Floyd)演算法
阿新 • • 發佈:2019-02-19
#include<iostream>
using namespace std;
#define MAXEDGE 20
#define MAXVEX 20
#define INFINITY 65535
typedef struct
{
int vexs[MAXVEX];
int arc[MAXVEX][MAXVEX];
int numVertexes, numEdges;
} MGraph;
typedef int Patharc[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];
/* 構建圖 */
void CreateMGraph(MGraph *G)
{
int i, j;
/* printf("請輸入邊數和頂點數:"); */
G->numEdges = 16;
G->numVertexes = 9;
for (i = 0; i < G->numVertexes; i++)/* 初始化圖 */
{
G->vexs[i] = i;
}
for (i = 0; i < G->numVertexes; i++)/* 初始化圖 */
{
for ( j = 0; j < G->numVertexes; j++)
{
if (i == j)
G->arc[i][j] = 0;
else
G->arc[i][j] = G->arc[j][i] = INFINITY;
}
}
G->arc[0][1] = 1;
G->arc[0][2] = 5;
G->arc[1][2] = 3;
G->arc[1][3] = 7;
G->arc[1][4] = 5;
G->arc[2][4] = 1;
G->arc[2 ][5] = 7;
G->arc[3][4] = 2;
G->arc[3][6] = 3;
G->arc[4][5] = 3;
G->arc[4][6] = 6;
G->arc[4][7] = 9;
G->arc[5][7] = 5;
G->arc[6][7] = 2;
G->arc[6][8] = 7;
G->arc[7][8] = 4;
for(i = 0; i < G->numVertexes; i++)
{
for(j = i; j < G->numVertexes; j++)
{
G->arc[j][i] = G->arc[i][j];
}
}
}
/* Floyd演算法,求網圖G中各頂點v到其餘頂點w的最短路徑P[v][w]及帶權長度D[v][w]。 */
void ShortestPath_Floyd(MGraph MG, Patharc P, ShortPathTable D)
{
int v, w, k;
for (v = 0; v < MG.numVertexes; v++)/* 初始化D與P */
{
for (w = 0; w < MG.numVertexes; w++)
{
D[v][w] = MG.arc[v][w];/* D[v][w]值即為對應點間的權值 */
P[v][w] = w;/* 初始化P */
}
}
for (k = 0; k < MG.numVertexes; k++)
{
for (v = 0; v < MG.numVertexes; v++)
{
for (w = 0; w < MG.numVertexes; w++)
{
/* 如果經過下標為k頂點路徑比原兩點間路徑更短 */
if (D[v][w] > D[v][k] + D[k][w])
{
/* 將當前兩點間權值設為更小的一個 */
D[v][w] = D[v][k] + D[k][w];
P[v][w] = P[v][k];/* 路徑設定為經過下標為k的頂點 */
}
}
}
}
}
int main(void)
{
int v, w, k;
MGraph MG;
Patharc P;
ShortPathTable D;
CreateMGraph(&MG);
ShortestPath_Floyd(MG, P, D);
cout << "各頂點間最短路徑如下: " << endl;
for (v = 0; v < MG.numVertexes; v++)
{
for (w = v + 1; w < MG.numVertexes; w++)
{
cout << "v" << v << "--" << "v" << w << " weight: " << D[v][w]
<< " Path: " << v << ' ';
k = P[v][w];
while (k != w)
{
cout << "-> " << k << " ";
k = P[k][w];
}
cout << "-> " << w << endl;
}
cout << endl;
}
return 0;
}
using namespace std;
#define MAXEDGE 20
#define MAXVEX 20
#define INFINITY 65535
typedef struct
{
int vexs[MAXVEX];
int arc[MAXVEX][MAXVEX];
int numVertexes, numEdges;
} MGraph;
typedef int Patharc[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];
/* 構建圖 */
void CreateMGraph(MGraph *G)
{
int
/* printf("請輸入邊數和頂點數:"); */
G->numEdges = 16;
G->numVertexes = 9;
for (i = 0; i < G->numVertexes; i++)/* 初始化圖 */
{
G->vexs[i] = i;
}
for (i = 0; i < G->numVertexes; i++)/* 初始化圖 */
{
for ( j = 0; j < G->numVertexes; j++)
{
if
G->arc[i][j] = 0;
else
G->arc[i][j] = G->arc[j][i] = INFINITY;
}
}
G->arc[0][1] = 1;
G->arc[0][2] = 5;
G->arc[1][2] = 3;
G->arc[1][3] = 7;
G->arc[1][4] = 5;
G->arc[2][4] = 1;
G->arc[2
G->arc[3][4] = 2;
G->arc[3][6] = 3;
G->arc[4][5] = 3;
G->arc[4][6] = 6;
G->arc[4][7] = 9;
G->arc[5][7] = 5;
G->arc[6][7] = 2;
G->arc[6][8] = 7;
G->arc[7][8] = 4;
for(i = 0; i < G->numVertexes; i++)
{
for(j = i; j < G->numVertexes; j++)
{
G->arc[j][i] = G->arc[i][j];
}
}
}
/* Floyd演算法,求網圖G中各頂點v到其餘頂點w的最短路徑P[v][w]及帶權長度D[v][w]。 */
void ShortestPath_Floyd(MGraph MG, Patharc P, ShortPathTable D)
{
int v, w, k;
for (v = 0; v < MG.numVertexes; v++)/* 初始化D與P */
{
for (w = 0; w < MG.numVertexes; w++)
{
D[v][w] = MG.arc[v][w];/* D[v][w]值即為對應點間的權值 */
P[v][w] = w;/* 初始化P */
}
}
for (k = 0; k < MG.numVertexes; k++)
{
for (v = 0; v < MG.numVertexes; v++)
{
for (w = 0; w < MG.numVertexes; w++)
{
/* 如果經過下標為k頂點路徑比原兩點間路徑更短 */
if (D[v][w] > D[v][k] + D[k][w])
{
/* 將當前兩點間權值設為更小的一個 */
D[v][w] = D[v][k] + D[k][w];
P[v][w] = P[v][k];/* 路徑設定為經過下標為k的頂點 */
}
}
}
}
}
int main(void)
{
int v, w, k;
MGraph MG;
Patharc P;
ShortPathTable D;
CreateMGraph(&MG);
ShortestPath_Floyd(MG, P, D);
cout << "各頂點間最短路徑如下: " << endl;
for (v = 0; v < MG.numVertexes; v++)
{
for (w = v + 1; w < MG.numVertexes; w++)
{
cout << "v" << v << "--" << "v" << w << " weight: " << D[v][w]
<< " Path: " << v << ' ';
k = P[v][w];
while (k != w)
{
cout << "-> " << k << " ";
k = P[k][w];
}
cout << "-> " << w << endl;
}
cout << endl;
}
return 0;
}