0%

Game 解题报告

这是DSA 2023 Spring PA 4的Game的解题报告,内容涉及二叉堆和Dijkstra算法。

A.所使用数据结构与算法的构思、原理和实现要点

所使用的数据结构:

二叉堆 列表

算法构思:

1 明显地,这道题是最短路径问题,应该用 Dijkstra 算法解决。
2 每次查询的过程是:将第一个节点标记、入堆。找到所有和堆顶节点(即:目前的从第一关到完成该关卡用时最少的点)相邻的点,如果这个相邻点没有被标记过,则标记,入堆。
3 为了计算最短路径方案数目,需要在相邻点被标记过,但是现在有一个新的方案可以实现相同的最短用时的情况下,增加到达该节点的方案数。
4 循坏执行,直到堆空且最后一个节点已经被标记,结束后输出结果。

实现要点:

1 每个节点的相邻节点个数不确定,需要使用列表存储。
2 二叉堆内部的二叉树同样用数组实现。
3 方案数随时取模,确保不会溢出。

B.完成过程中遇到的问题,排除问题的主要过程、使用的方法和技巧,以及参考资料

问题:五成测有许多测试点 Wrong Answer

通过自己构造测例并仔细观察过程中的二叉堆运行情况,修正了一些写代码上的错误,使程序可以通过九成测。

参考资料

除了习题课PPT,没有参考其他资料。

C.时间和空间复杂度的估算

时间复杂度

二叉堆的插入和删除操作均可在O(logn)时间内完成,一共完成n次,所以复杂度为O(nlogn)。其他时间可忽略。

空间复杂度

二叉堆的空间复杂度为O(n),列表要储存所有的点相邻关系,因此空间复杂度为O(m)。储存方案数和 Dijkstra 算法中用于记录节点是否被标记过的结构,空间复杂度也为O(n),所以总体空间复杂度为O(n+m)。