SPOJ FISHER的想法

时间:2012-05-17 17:57:46

标签: algorithm

我正在尝试在SPOJ上解决这个问题:

                  http://www.spoj.pl/problems/FISHER/

我无法想出这个解决方案。我在topcoder上发现了一些线程,但我只能推断出要使用DP。如果有人可以指导我,那将是非常有帮助的。

3 个答案:

答案 0 :(得分:2)

如果使用动态编程来解决正常的最短路径问题,则会得到http://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm。当然,这忽略了时间限制。您总是可以通过扩展状态空间来使动态编程算法更加灵活 - 成本更高。在这种情况下,不是在每个节点跟踪到目前为止找到的那个节点最便宜的路径的成本,而是可以跟踪,因为i = 1,2,3,4 ..的最便宜路径的成本时间到该节点的节点最多为i。您应该能够使用用于计算单个成本的递归变量来更新此成本数组 - 每个边缘放宽都会在给定时间内获得最便宜成本的向量,并考虑在每个偏移处添加该边的时间和成本以查看是否到目前为止,生成的扩展路径优于以该边结束的最佳已知路径。

我想知道你是否可以通过类似方式转换Dijkstra的算法来节省时间?至少你可以先运行Dijkstra的算法,然后将所有节点丢弃的时间最短,比你的时间限制更长。

答案 1 :(得分:1)

解决问题的另一种方法是使用Dijkstra算法http://www.geeksforgeeks.org/greedy-algorithms-set-6-dijkstras-shortest-path-algorithm/。约束为n<=50time<=1000。令时间给定= T.因此,我们将每个节点扩展为T个节点,其中dist[node][i]表示给定时间i的节点的最短路径。因此,我们将在具有n * T边的n * n * T个节点上运行算法,这将完全在O((n * T + n * n *T) * log( N * T) )的复杂度的给定时间限制内。 我接受的解决方案:http://ideone.com/H8UUMf

答案 2 :(得分:0)

使用动态编程。

如果所有路径花费的时间都比成本高,那么您只跟踪节点的路径。当您看到新路径时,您可以使用二进制搜索来查找同一时间​​或更短时间的最长时间路径,然后仅在成本低于该路径并且未超过时间限制时添加新路径。添加时,请删除所有需要更长时间且不便宜的现有路径。

您最终会得到一个到时间排列的最终节点的路径数组。选择最适合时间约束的那个。

请注意,您可能需要考虑节点的待办事项列表,并且节点可以多次结束该待办事项列表(每当您找到新的廉价路径时,它会回到它上面。)