课程设计 最小时间 最短路径 模板 .

这是一篇关于课程设计的博客,作者通过使用迪杰斯特拉算法解决了寻找最小时间的最短路径问题。尽管遇到一些困难,但最终意识到在遇到思路清晰但实现出错的情况时,重新编写代码能有效解决问题。文章提及对于这类问题,弗洛伊德算法也可行,但可能不适用于数据规模较大的情况。
摘要由CSDN通过智能技术生成
题目描述
  有多个城市组成一个铁路交通网络。任意两个城市之间有直连铁路,或者通过其他城市间接到达。给定某个城市,要求M时间内能到达任意指定的另一城市,求最小的M。
输入
每个测试用例由多行组成,第一行是整数n(1 <= n <= 100),表示城市的数目。
其余行表示邻接矩阵A。A(i,j)的值如果是一个整数t,表示城市i与城市j有铁路直连,需要t时间到达另一方。如果A(i,j)的值为x,表明城市i与城市j之间没有直连铁路。很明显有A(i,i) = 0。
由于对称关系和A(i,i) 为 0,输入只给出矩阵的下三角。第一行A(1,1)在输入中省略,第二行只有A(2,1),下一行则是A(3,1) 和A(3,2),依此类推。

输出
输出城市1所对应的最小M。

样例输入
5
50
30 5
100 20 50
10 x x 10
样例输出

35

思路:最短路径模板题目,这个题目采用迪杰斯特拉算法就可以,模板题目,但是坑了我4个小时,学校的机房电脑有毒,以后再遇到这种思路没有问题的题目时,毁了之前的代码从新写一遍即可,听同学说这个题目卡时间不多,用弗洛伊德也可以O(N^3),对数据比较大的题目就不是很方便了。

include <cstdio> 
#include <iostream> 
#include <algorithm> 
#include <cstring> 
using 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dijkstra算法 Dijkstra算法的思路是:设有向图G=(V,E),其中,V={v0,v1,…,vn-1},cost[i][j]表示有向边的权值。若不存在有向边,则cost[i][j]的权为无穷大(∞)。数组ds记录从源点到其他各顶点当前的最短距离,其初值ds[i]=cost[v][i],从s之外的顶点集合V-S中选一个顶点vu,使ds[u]的值最小。于是从源点v到达只通过s中的顶点,把u加入集合s中调整ds中的记录从源点到V-S中每个顶点vj的距离:从原来的ds[j]和ds[u]+cost[u][j]中选择较小的值作为新的ds[j]。重复上述过程,直到s中包含其余各顶点的最短路径 Floyd-warshall算法 Floyd-warshall算法的基本思想是:如果从vi到vj有边,则从vi到vj存在一条长度为cost[i][j]的路径。该路径不一定是最短路径,尚需要进行n次试探。首先考虑路径(vi,v0, vj)是否存在。如果存在,则比较其路径长度。取长度较短者为从vi到vj的中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点v1,即如果(vi,…, v1)和(v1,…,v)分别是当前找到的中间顶点的序号不大于0的最短路径,那么,(vi,…, v1,…, vj)就有可能是从vi到vj中间顶点的序号不大于1的最短路径。将它和已经得到的从vi到vj中间顶点的序号不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径后,在增加一个顶点v2,继续进行试探。依次类推,直至经过n次比较,最后求得的必是从vi到vj的最短路径。按此方法,可以同时求得各对顶点间的对段距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值