什么是SPOJ COURIER的正确方法

时间:2015-04-14 22:32:01

标签: algorithm language-agnostic dynamic-programming

我正在尝试解决有关spoj的COURIER问题。我能够理解我必须用动态编程方法来解决这个问题,但是我无法完全理解我在同一对城市之间处理多个包裹的方法是否正确。我的伪代码有点如下:

1) Use floyd warshall to find all pair shortest path in O(n^3). Some pair of cities are connected by more than one roads, I can just keep the shortest one for my undirected graph.
2) Add the shortest cost for each request start to end.
3) Create a new directed graph for each of 12 requests and homecity. The node of this new graph will be a merge of each request's source and destination. The edge weight between a->b can be calculated by shortest path between 'a' request's destination to 'b' request's source.I am thinking of duplicating the pairs if I have multiple request between them.
4) Use a TSP DP to solve this new undirected 13 city TSP problem. O(n^2 2^n) would come around 1384448. Not sure whether this will time out for multiple test cases.

您能否提出您的意见,因为我使用创建这个新的有向图的方法使问题复杂化了?我没有使用只有5个不同请求的信息。我知道我可以编写这个并知道,但我想先得到一些关于解决方案的建议。

2 个答案:

答案 0 :(得分:1)

好问题。

在执行第1点之后,您可以忽略所有非交付来源或地址的城市。

因此,您有10个旅行者目前所在的城市,以及2 ^ 12种可能仍未完成的任务组合。

您可以使用两个参数来执行DP:当前城市和要完成的交付,您可以使用位掩码进行存储。

编辑:

如上所述,您有两个参数:p跟踪当前位置和掩码,它跟踪您已经完成的访问。

掩码用作位掩码:http://en.wikipedia.org/wiki/Mask_%28computing%29

您从掩码0开始,以二进制为000000000000。当您执行第5次请求的旅行时,您将掩码更改为:000000010000等。

首先调用f(p = 0,mask = 0)。

当您解决f(p,mask)时,您有两种选择。您可以移动到任何其他城市p2。你可以做旅行p - > p2如果这是您尚未完成的旅行之一。在所有这些选项中,您必须选择最佳选项。

这个问题非常棘手,我建议首先使用位掩码来解决更容易的问题。你可以在这里找到一些:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=778

答案 1 :(得分:1)

我不知道你现在是否需要答案,但这就是我所做的:

最初你的方法是正确的,你必须申请floyd-warshall 最短距离b / w所有对。现在它是一个经典的dp +位掩码 问题。只有12个操作,您必须安排这12个操作 这样你就得到了最低限度。

这可以通过使用位掩码来完成:000000000000
你有这12个状态=>如果你选一个,你就不能再选择了。从那以后 (2 ^ 12 = 4096)存储这样的数字并不困难。

我的dp状态很直接:'面具号码'和'父母' 父 - >你做的最后一次手术

DP [掩模] [面值]
希望这会有所帮助