#include "pch.h"
#include "__0 Basic_operation.h"
#include <iostream>
#include <vector>
typedef vector<vector<int>> PathMatirc; //用于存储最短路径下标的数组
typedef vector<vector<int>> ShortPathTable; //用于存储到各点最短路径的的权值和
/****Floyd算法****/
/*求无向网G中各顶点V到其余顶点W最短路径P[V][W]及带权长度D[V][W]*/
void ShortestPath_Floyd(const MGraph& G, PathMatirc& P, ShortPathTable& D)
{
/* 设置二维数组大小 */
P.resize(G.numVertexes);
D.resize(G.numVertexes);
for (int i = 0; i < G.numVertexes; ++i) {
P[i].resize(G.numVertexes);
D[i].resize(G.numVertexes);
}
/*初始化D与P*/
for (int v = 0; v < G.numVertexes; ++v) {
for (int w = 0; w < G.numVertexes; ++w) {
D[v][w] = G.arcs[v][w]; //D就初始化为对应的矩阵
P[v][w] = w;
}
}
/*循环开始,k代表中转节点,v代表起始节点,w代表结束节点*/
for (int k = 0; k < G.numVertexes; ++k) {
for (int v = 0; v < G.numVertexes; ++v) {
for (int w = 0; w < G.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的顶点
}
}
}
}
}
/*结果显示*/
void Show_Floyd(const MGraph& G, const PathMatirc& P, const ShortPathTable& D)
{
for (int v = 0; v < G.numVertexes; ++v) {
for (int w = v + 1; w < G.numVertexes; ++w) {
std::cout << " V" << v << " -- V" << w << " weight:" << right << setw(2) << D[v][w];
std::cout << " path: " << v; //打印源点
int k = P[v][w]; //获得第一个路径顶点下标
while (k != w) {
std::cout << " -> " << k; //打印路径顶点
k = P[k][w]; //获得下一个路径顶点下标
}
std::cout << " -> " << w << std::endl; //打印终点
}
std::cout << std::endl;
}
}
int main() {
/* P267 无向网 0 1 2 3 4 5 6 7 8 */
vector<vector<EdgeType>> vv{ {0, 1, 5, N, N, N, N, N, N},
{1, 0, 3, 7, 5, N, N, N, N},
{5, 3, 0, N, 1, 7, N, N, N},
{N, 7, N, 0, 2, N, 3, N, N},
{N, 5, 1, 2, 0, 3, 6, 9, N},
{N, N, 7, N, 3, 0, N, 5, N},
{N, N, N, 3, 6, N, 0, 2, 7},
{N, N, N, N, 9, 5, 2, 0, 4},
{N, N, N, N, N, N, 7, 4, 0} };
MGraph G;
CreateMGraphByArray(G, vv, 0); //传入 0 表示无向图
ShowMGraph(G);
PathMatirc P; //用于存储最短路径下标的数组
ShortPathTable D; //用于存储到各点最短路径的的权值和
ShortestPath_Floyd(G, P, D);
std::cout << "\n弗洛伊德算法求得最短路径如下:\n";
Show_Floyd(G, P, D);
return 0;
}
__3.7.2 最短路径—弗洛伊德算法
猜你喜欢
转载自blog.csdn.net/qq_40843865/article/details/89225085
今日推荐
周排行