实验五 图编程题1. 踩点上课【问题描述】 阿迪通常开着闹钟睡觉,这样他才不至于上课迟到。 他想知道能否赶上第一节课,为了不迟到,他需要知道从家到学校所需要的最少时间是多少。 阿迪生活的城市是一个 n×m 的矩形区域,其中每个单元( i, j )由一个数字 aij 来表示数字为 -1 时表示该单元被占用,禁止通行数字为 0 时表示该单元是空闲的,阿迪可以穿过数字为 x (1≤x ≤109) 时表示该单元包含时空通道,需要耗费的时间成本为 x,包含时空通道的单元也是空闲的,可以自由通行 从任何包含时空通道的单元出发,阿迪可以去往任何包含时空通道的其他单元,从时空通道( i, j )到时空通道( x, y ) 的时间成本总和为 aij + axy。 除了在两个包含时空通道的单元之间移动,他也可以在具有相邻边的未被占用的单元之间移动,耗费的时间为 w 。实际上,他也可以进入一个包含时空通道的单元而不使用它这个通道。 开始时,阿迪处在左上角单元 (1, 1),而学校位于右下角(n, m)。【输入形式】 输入的第一行包含三个整数 n、m 和 w (2 ≤ n、m ≤ 2×103,1≤ w ≤109),此处 n 和 m 是城市的大小,w 是在未被占用的单元之间移动所需要的时间。 接下来的 n 行每行包含 m 个数 (-1 ≤ ai ≤ 109),表示对单元的描述。 输入保证单元(1, 1)和(n, m)是空闲的。
【输出形式】 输出为一个数,表示阿迪去往学校需要花费的最少时间,如果他不能去到学校,则输出-1。【样例输入】5 5 10 -1 0 1 -10 20 0 0 -1-1 -1 -1 -1 -13 0 0 0 0-1 0 0 0 0
【样例输出】14
代码如下:
https://share.weiyun.com/v2UGz1mV
代码中有少部分样例会出现运行时过长和输出错误,但代码的整体思路就是这样的