采用神奇桥梁的方法

时间:2014-09-20 09:52:57

标签: algorithm graph graph-algorithm dijkstra

我试图解决http://www.spoj.com/problems/AMR11F/

  霍格沃茨魔法学校有一条圆形车道   N塔编号为1到N.塔i和i + 1彼此相邻   对于1≤i<1。 N和塔1和N彼此相邻。每   这些塔楼的楼层数恰好为F楼层数   1,2,3,..,F-1,F从下到上。塔中的地板i和i + 1是   彼此相邻,在它们之间移动需要一秒钟。   在塔楼和地板之间移动也需要一秒钟   1个相邻的塔楼。除此之外,还有M座桥梁   设计用于在食死徒攻击的情况下快速逃脱   连接两个不同塔楼的楼层。这些桥梁中的每一个   作为bi fi bj fj t给出,意味着它需要t秒才能移动   这座桥连接塔楼的楼层和楼层fj   塔bj。所有方式都是双向的。

     

给定(qbi,qfi)和(qbj,qfj),找到最小时间(以秒为单位)   需要达到塔qbj的楼层qfj,从qfi楼层开始   塔qbi。你必须回答很多这样的问题。

     

输入(STDIN):

     

第一行包含测试案例的数量T.T案例如下。   每个测试用例由第一行中的N F M组成。 N是数字   塔楼,F是每个塔楼的楼层数,M是数量   桥梁。如上所述,M行跟随,每个形式为bi fi bj fj t   在问题陈述中。下一行包含Q,查询数   和Q行后面,每个形式qbi qfi qbj qfj。

     

输出(STDOUT):

     

对于qbi qfi qbj qfj形式的每个查询,输出一行表示   达到塔楼qfj所需的最短时间(秒)   qbj,从塔qbi的qfi楼开始。

     

约束:

     

1≤T≤3

     

2≤N,M≤100

     

2≤F≤1,000,000

     

1≤t≤1,000,000

     

1≤Q≤100,000

     

1≤bi,bj,qbi,qbj≤N

     

1≤fi,fj,qfi,qfj≤F

我的第一种方法是使用dikjstra并将每个楼层表示为节点。但问题是楼层的数量是10 ^ 8,而且肯定是内存不足。

然后我读到某个地方,我应该只将那些楼层表示为图中的节点,这些节点实际上是使用桥连接的。但在这种情况下,问题出在查询部分,因为查询的楼层可能不在图表中。

有人可以就这件事情说清楚吗?

谢谢, Umair

1 个答案:

答案 0 :(得分:1)

您不应将每个楼层表示为节点。请注意,桥的数量限制为100个。

因此,您的图表应仅包含通过桥梁连接的楼层(或者它们是您可以跳到相邻塔楼的最低楼层)。

由于您将被要求多次查询最短路径,因此为每个查询运行Dijksra将效率低下,因此我建议&#34;所有对最短路径&#34;算法,如Floyd Warshall's或Johnson's算法。

您可以运行任何一次APSP算法,并在任意两对节点之间构建一个最短路径的二维数组。因此,您将获得O(1)响应时间。

另请注意,查询楼层可能不在您的图表中。我留给你照顾这个。