刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

4.最短路
给定一个n个点, m条边的有向图, 求从点S出发, 到其它所有点的最短路径.

时间限制:2000
内存限制:65536
输入
第一行一个整数T, 表示有T组数据 对于每组测试数据, 第一行三个整数n, m, S, 表示有n个点, m条边, 起点为S. 接下来m行, 每行三个整数x, y, z, 代表从x到y有长度为z的边 点的编号从1到n T <= 10, n <= 10000, m <= 20000, |z| <= 10000. 所有数据的n之和 <= 30000, 所有数据的m之和 <= 60000.输出
对于每组数据: 如果从S点出发可以走入负圈 (即到某些点的最短路径可以无限小), 那么输出一行Error. 否则, 输出一行用空格分隔的n个整数, 其中第i个整数表示从S点到i点的最短路长度. 如果从S点无法到达i点, 则第i个输出为”null”.
样例输入
```
4
5 7 1
1 2 3
2 3 4
3 4 8
1 3 9
4 5 1
1 4 5
1 5 10
4 4 1
1 2 -4
2 3 8
1 3 5
3 4 0
3 3 2
1 2 -3
2 3 -4
3 1 6
4 2 1
1 2 1
3 4 2
```
样例输出
```
0 3 7 5 6
0 -4 4 4
Error
0 1 null null
```

使用微信搜索喵呜刷题,轻松应对考试!

答案:

对于每组数据,首先使用Dijkstra算法求出从起点S到所有点的最短路径。如果在求解过程中发现存在负圈,即存在从S点出发可以走入负圈的情况,则输出"Error"。否则,输出从S点到每个点的最短路径长度。如果无法从S点到达某个点,则输出"null"。

解析:

【喵呜刷题小喵解析】:
本题要求求解从起点S到所有点的最短路径,可以使用Dijkstra算法来求解。Dijkstra算法是一种求解单源最短路径问题的经典算法,适用于边权非负的有向图。

对于每组数据,首先使用Dijkstra算法求出从起点S到所有点的最短路径。在求解过程中,如果发现存在负圈,即存在从S点出发可以走入负圈的情况,则输出"Error"。否则,输出从S点到每个点的最短路径长度。如果无法从S点到达某个点,则输出"null"。

由于输入数据较大,需要使用高效的算法来求解。Dijkstra算法的时间复杂度为O((V+E)logV),其中V为顶点数,E为边数。由于本题中V和E都较大,因此需要优化算法以提高效率。可以使用堆来优化Dijkstra算法,将时间复杂度降低到O(ElogV)。

在求解过程中,需要记录每个点的最短路径长度和最短路径的来源点。对于每个点,记录其最短路径长度和最短路径的来源点,以便在求解过程中更新最短路径。

最后,按照题目要求输出从S点到每个点的最短路径长度。如果无法从S点到达某个点,则输出"null"。
创作类型:
原创

本文链接:4.最短路给定一个n个点, m条边的有向图, 求从点S出发, 到其它所有点的最短路径.时间限制:20

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share