无法输入图表

时间:2016-07-01 06:39:01

标签: c++ algorithm graph dijkstra

我正在解决C ++中的问题http://www.spoj.com/problems/SHOP/,但我无法弄清楚如何输入图形以便在其中应用Dijkstra算法。 这是图表格式 -
4 3
X 1 S 3
4 2 X 4
X 1 D 2

第一行显示了列&网格的行,“S”& “D” - 分别表示源和目的地数字 - 表示传递该块所需的时间,“X”表示无进入区域。
请根据DIjkstra算法的要求在节点和边缘转换下图。我不知道如何将地图转换为图形。

2 个答案:

答案 0 :(得分:1)

无需将矩阵转换为节点和边。 您可以创建包含(行号,列号,时间)的结构,其中时间将表示从源到达此坐标所花费的时间。现在用密钥作为时间制作这个结构的最小堆。现在从最小堆中提取元素(最初源将在最小堆中,时间为0)并将相邻元素推入最小堆(仅限那些未访问且不包含X的元素)设置访问提取元素true.Go就像这样,直到提取的元素不是目的地。

答案 1 :(得分:1)

无需转换。想象一下你在某个方面(i,j)。 (我假设每个方格允许你进行四次移动)。然后,你可以去(i + 1,j),(i,j + 1),(i - 1,j),(i,j - 1),如果:

1)该索引在表格内 2)该索引未标记为X

因此,您将方形S的位置赋予Dijkstra算法。每次将新的允许方块添加到数据结构中。一旦到达D的位置,就可以打印出来。

此外,这个问题对我来说似乎并不重要,因此您可以使用简单的BFS以及使用队列。但是如果你想使用Dijkstra并且去不同的广场有不同的成本。您使用优先级队列而不是队列。 例如,您可以使用如下设置数据结构:

<plannerBenchmark>
    <benchmarkDirectory>local/data/report/vehiclerouting</benchmarkDirectory>
    .....
    <inputSolutionFile>data/vehiclerouting/unsolved/TestCase_1.xml</inputSolutionFile>
    .....
</plannerBenchmark>