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

简答题

最短路
给定一个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

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

答案:

解析:

【喵呜刷题小喵解析】该题目要求从给定的有向图中找出从起点S到所有其他点的最短路径。可以使用Dijkstra算法来解决这个问题。首先,读入测试数据的组数T,然后对每组测试数据,读入节点数n、边数m和起点S。然后,构建图的邻接表表示,其中每个节点x的邻接表是一个列表,列表中的元素是(y, z)形式的元组,表示从节点x到节点y有一条长度为z的边。接下来,使用Dijkstra算法计算从起点S到所有其他节点的最短路径。在Dijkstra算法中,使用dist数组来存储从起点S到每个节点的最短路径长度,使用prev数组来存储从起点S到每个节点的最短路径中上一个节点的编号。在计算最短路径时,首先初始化dist数组和prev数组,将dist数组中的所有元素都设置为无穷大,将prev数组中的所有元素都设置为-1。然后,使用min_index函数找到未访问节点中距离最小的节点,更新其相邻节点的最短路径长度和最短路径中上一个节点的编号。重复执行这个过程,直到所有节点都被访问过。最后,输出最短路径结果。如果存在无法到达的节点,则输出"null"。如果存在负圈,则输出"Error"。否则,输出从起点S到每个节点的最短路径长度,用空格分隔。需要注意的是,在Dijkstra算法中,如果图中存在负权边,则无法正确计算最短路径。因此,在输出最短路径结果之前,需要检查是否存在无法到达的节点和负圈。如果存在无法到达的节点,则输出"null"。如果存在负圈,则输出"Error"。
创作类型:
原创

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

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

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

分享考题
share