3917 【NOIP2014模拟11.2A组】福慧双修 (Standard IO)题解

目录

原题

Description

菩萨为行,福慧双修,智人得果,不忘其本。
——唐·慧立《大慈恩寺三藏法师传》
有才而知进退,福慧双修,这才难得。
——乌雅氏
如何福慧双修?被太后教导的甄嬛徘徊在御花园当中。突然,她发现御花园中的花朵全都是红色和蓝色的。她冥冥之中得到了响应:这就是指导她如何福慧双修的!现在御花园可以看作是有N块区域,M条小路,两块区域之间可通过小路连接起来。现在甄嬛站在1号区域,而她需要在御花园中绕一绕,且至少经过1个非1号区域的区域。但是恰好1号区域离碎玉轩最近,因此她最后还是要回到1号区域。由于太后教导她要福慧双修,因此,甄嬛不能走过任何一条她曾经走过的路。但是,御花园中来往的奴才们太多了,而且奴才们前行的方向也不一样,因此甄嬛在走某条小路的时候,方向不同所花的时间不一定一样。天色快暗了,甄嬛需要尽快知道至少需要花多少时间才能学会如何福慧双修。如果甄嬛无法达到目的,输出“-1”。

Input

第一行仅2个正整数n,m,意义如题。
接下来m行每行4个正整数s,t,v,w,其中s,t为小路所连接的两个区域的编号,v为甄嬛从s到t所需的时间,w为甄嬛从t到s所需的时间。数据保证无重边。

Output

仅一行,为甄嬛回到1号区域所需的最短时间,若方案不存在,则输出-1

Sample Input

输入1:
3 3
1 2 2 3
2 3 1 4
3 1 5 2
输入2:
3 2
1 2 1 1
2 3 1 2

Sample Output

输出1:
8
输出2:
-1
[样例解释]
对于第一个数据:路径为1->2->3->1,所需时间为8,而1->3->2->1所花时间为9。因此答案为8.

Data Constraint

对于40%的数据:n<=1,000; m<=5,000
对于100%的数据:1<=n<=40,000; 1<=m<=100,000; 1<=v,w<=1,000

题解

40分

我们可以每次枚举与1直接相连的点i,然后删掉这条从1到i的边,然后跑一遍最短路算法即可,但如果遇到类似菊花图那样的数据,时间复杂度不佳。

100分

模型转换

回顾四十分的方法我们明显可以看出,这是一个最短路模型,其次,在我们走出第一步之后,我们跑了很多重复的东西,这就启发我们,重新构图,并加入一个新的点,再跑最短路求答案。

做法

我们先跑一次最短路,
求出1到其他所有点的最短路,并记为 d i s u
并记录这条路径上的第一个点(1不算),记为为 p r e v u
然后我们考虑每一条边,构建新图,模拟汇点T,这也正是这道题目精华。

I

当前这条边为(u,1,w)
①如果 p r e v u 不等于u说明存在一条路径,1-> p r e v u ->……u->1,
那么此时我们连一条边(1,T,w+ d i s u ),为什么?跑最短路的时候快。
②如果 p r e v u 等于u,那么我们不能像上面那样子做(它无法像上面那样返回),但是如果有其他(不一定最短)的路径到达u,那么则连一条边(u,T,w);

II

当前这条边为(1,v,w)
①如果 p r e v v = v
此时无需加边, d i s v 已经取代该边
②说明1到v的最短路径并不是w,这时候我们可以连一条边(1,v,w)。

III

当前这条边为(u,v,w)(u<>1,v<>1)
①如果 p r e v v <> p r e v u
说明存在一条路径1-> p r e v u ->u->v
那么此时我们应该连一条(1,v, d i s u +w)。
②保留这条边
接着我们就可以跑一遍最短路,求出1到T的最短路。

小结

这道题,还是值得细细品味,不要老是只把做题当做做题,慢慢享受其中的乐趣与妙处。

猜你喜欢

转载自blog.csdn.net/ganjingxian/article/details/79176900
今日推荐