目录
原题
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到其他所有点的最短路,并记为
disu
d
i
s
u
并记录这条路径上的第一个点(1不算),记为为
prevu
p
r
e
v
u
。
然后我们考虑每一条边,构建新图,模拟汇点T,这也正是这道题目精华。
I
当前这条边为(u,1,w)
①如果
prevu
p
r
e
v
u
不等于u说明存在一条路径,1->
prevu
p
r
e
v
u
->……u->1,
那么此时我们连一条边(1,T,w+
disu
d
i
s
u
),为什么?跑最短路的时候快。
②如果
prevu
p
r
e
v
u
等于u,那么我们不能像上面那样子做(它无法像上面那样返回),但是如果有其他(不一定最短)的路径到达u,那么则连一条边(u,T,w);
II
当前这条边为(1,v,w)
①如果
prevv=v
p
r
e
v
v
=
v
此时无需加边,
disv
d
i
s
v
已经取代该边
②说明1到v的最短路径并不是w,这时候我们可以连一条边(1,v,w)。
III
当前这条边为(u,v,w)(u<>1,v<>1)
①如果
prevv<>prevu
p
r
e
v
v
<>
p
r
e
v
u
,
说明存在一条路径1->
prevu
p
r
e
v
u
->u->v
那么此时我们应该连一条(1,v,
disu
d
i
s
u
+w)。
②保留这条边
接着我们就可以跑一遍最短路,求出1到T的最短路。
小结
这道题,还是值得细细品味,不要老是只把做题当做做题,慢慢享受其中的乐趣与妙处。