__3.7.2 最短路径—弗洛伊德算法

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_40843865/article/details/89225085