我试图解决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
答案 0 :(得分:1)
您不应将每个楼层表示为节点。请注意,桥的数量限制为100个。
因此,您的图表应仅包含通过桥梁连接的楼层(或者它们是您可以跳到相邻塔楼的最低楼层)。
由于您将被要求多次查询最短路径,因此为每个查询运行Dijksra将效率低下,因此我建议&#34;所有对最短路径&#34;算法,如Floyd Warshall's或Johnson's算法。
您可以运行任何一次APSP算法,并在任意两对节点之间构建一个最短路径的二维数组。因此,您将获得O(1)响应时间。
另请注意,查询楼层可能不在您的图表中。我留给你照顾这个。