最短路径-弗洛伊德算法


void SchoolMap::FindRoad(int a, int b, int &StepNUM, int &Dis,int Step[])
{
	int D[11][11], Path[11][11], i, j, k; 
	for (int i = 0; i<BudingNUM; ++i)
		for (int j = 0; j<BudingNUM; ++j)
		{
			if (i == j)
			{
				D[i][j] = 0; Path[i][j] = 0;
			}
			else
			{
				D[i][j] = Road[i][j];
				if (D[i][j] < 999) {
					Path[i][j] = j;
				}
				else    Path[i][j] = -1;
			}
		}
	for (int k = 0; k < BudingNUM; ++k)
	{
		for (int i = 0; i < BudingNUM; ++i)
		{
			for (int j = 0; j < BudingNUM; ++j)
			{
				if(D[i][j]>(D[i][k]+D[k][j]))  
				{
					D[i][j] = D[i][k] + D[k][j];
					Path[i][j] = Path[i][k];  
                                }
			}
		}
		Dis = D[a][b];
	}
	Budings[a].ShowName();
	while (a != b)
	{ 
		 cout << "-";
		 Budings[Path[a][b]].ShowName();
		 a = Path[a][b];
	}
	cout << endl;
	
}

我认为这个算法最重要的地方在于Path 保存点的那一处:

例如我走的是0-5这条路线 压经过0-3和3-5最短 而0-3又要经过0-1和1-3最短 那么用Path保存 当只允许走1号顶点的时候(k=1)时候 Path[i][j] = Path[i][k];将Path[i][k];这个值保存 k=1时 这个值为1 因此0-3=1 当走0-5的时候在3号顶点的时候(k=3)时Path[0][5]=Path[0][3] 而Path[0][3]的值正好是必须经过0-1时候的赋值 以此类推 Path就很好的保存了走这条路线每一条最短的必经路线将其值从底传至顶部保存下来 下一次访问 通过a = Path[a][b];如果a-b之间还有最短路径 那么其中必然存在传上来的值 会走那条路线

### 关于弗洛伊德算法解决最短路径问题的PTA练习题解析 #### 背景介绍 弗洛伊德算法用于求解所有顶点到所有其他顶点之间的最短路径,适合处理稠密图的情况。该算法基于动态规划思想,通过引入中间节点来不断优化当前已知的最佳路径。 #### 算法描述 对于给定的一个带权有向图G=(V,E),其中|V|=n, Floyd-Warshall算法的核心在于迭代更新距离矩阵D[i][j],表示从i到j之间可能存在的最小权重路径。初始状态下,如果存在边<i,j>则设d(i,j)=w(i,j); 否则设置为无穷大∞。随后遍历每一个潜在中介结点k∈{0,...,n−1},并尝试经由它改进现有的估计值: \[ D^{(k)}_{ij}=min(D^{(k-1)}_{ij},\;D^{(k-1)}_{ik}\:+\:D^{(k-1)}_{kj}) \] 此过程重复执行直到完成全部n轮扫描为止[^2]。 #### Python实现示例 下面给出一段简单的Python代码实现了上述逻辑: ```python def floyd_warshall(graph): V = len(graph) dist = [[float('inf')]*V for _ in range(V)] # 初始化邻接矩阵 for i in range(V): for j in range(V): if graph[i][j]: dist[i][j] = graph[i][j] # 对角线元素置零 for k in range(V): dist[k][k]=0 # 动态规划核心部分 for k in range(V): for i in range(V): for j in range(V): if (dist[i][k]+dist[k][j]<dist[i][j]): dist[i][j]=dist[i][k]+dist[k][j] return dist ``` #### PTA题目实例分析 假设有一道来自PTA平台上的典型应用案例:“旅游规划”。在这个场景下,城市被视作图中的各个节点;而连接两座城市的道路及其对应的行驶时间构成了加权边。任务是要找出任意一对城市间最快的旅行路线——这正是典型的多源最短路问题! 具体来说,输入数据会提供一张完整的交通网络拓扑结构以及每条路段所需耗时的信息表单;程序需据此构建相应的邻接矩阵形式表达的地图模型,并调用前述定义好的`floyd_warshall()`函数来进行全局最优方案搜索操作。最终输出结果应当呈现为一个二维数组,记录着各组起点至终点间的最低成本数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值