【NOIP2013模拟11.7A组】迷宫花坛

【NOIP2013模拟11.7A组】迷宫花坛

题目

圣玛格丽特学园的一角有一个巨大、如迷宫般的花坛。大约有一个人这么高的大型花坛,做成迷宫的形状,深受中世纪贵族的喜爱。维多利加的小屋就坐落在这迷宫花坛的深处。某一天早晨,久城同学要穿过这巨大的迷宫花坛,去探望感冒的维多利加。
整个迷宫可以用N个路口与M条连接两个不同路口的无向通道来描述。路口被标号为1到N,每条通道有各自的长度。整个迷宫一定是连通的,迷宫中可能存在若干个环路,但是,出于美观考虑,每个路口最多只会属于一个简单环路。例如,图1所示的迷宫是非常美观的,但图2则不符合我们的描述,因为3号路口同属于两个简单环。
在这里插入图片描述你需要回答多个这样的询问:假如久城处在路口x,维多利加的小屋处在路口y,久城最短需要走多少距离才能到达小屋?

Input

第一行2个整数N,M,表示迷宫花坛的路口数和通道数;
接下来N行,每行3个整数x,y,z,描述一条连接路口x与路口y,长度为z的通道;
再接下来1行包含一个整数Q,表示询问数量;
之后Q行,每行2个整数x,y,描述一个询问。

Output

对于每个询问输出一行一个整数,表示最短距离。

Sample Input

4 4
1 2 1
2 3 2
1 3 2
3 4 1
2
2 4
1 3

Sample Output

3
2

Data Constraint

对于30%的数据,N≤100;
另有30%的数据,保证N=M;
对于100%的数据,1≤N≤100,000,Q≤200,000,1≤x,y≤N,1≤z≤1000.

解题思路

首先规定以DFS到的第一个在此环上的点视为父亲。
v a l i val_{i} 表示第 i i 个点向左或向右到父亲的距离(注意:同一环中,点到父亲的距离的方向是相同的,例如:在这里插入图片描述
这里的 v a l val 依次为 [ 0 , 1 , 3 , 0 ] [0,1,3,0] [ 0 , 4 , 2 , 0 ] [0,4,2,0]
然后我们将每个环变成一个菊花图,,其余点连向父亲,边权为这个点到父亲的最短路,将其命名为 D i s Dis
最后,在已经变好的树上做lca,最后我们向上跳到的两个点(点 t x tx 和点 t y ty ),设 a n s ans 为跳到点 t x tx 和点 t y ty 的路径和,两点就会有两种情况:1.两个点在原图中不在同一个环,处理情况和普通的lca一样;2.两个点在原图中在同一个环,那么之前定义的 D i s Dis v a l val 就排上用场了。
怎么用呢???
看一看答案有什么情况:在这里插入图片描述
一共有三种情况:1.答案路径不经过父亲且点 t y ty 到父亲的最短路(即 D i s Dis )不经过点 t x tx ,很容易发现答案路径的长度为 a n s + v a l t x v a l t y ans+\left | val_{tx}-val_{ty} \right | ;2.答案路径经过父亲且点 t x tx t y ty 到父亲的最短路都不经过对方,那么答案路径的长度为 a n s + D i s t x + D i s t y ans+Dis_{tx}+Dis_{ty} ;3.答案路径不经过父亲且点 t y ty 到父亲的最短路经过点 t x tx ,则答案路径的长度为 a n s + v a l t x v a l t y ans+\left | val_{tx}-val_{ty} \right | 。之后我们发现答案路径的长度总是优于另外一条路(这个的原因自己推导一下就能发现了)
综上所述,我们的两点 t x tx t y ty 在情况2中答案为 a n s + M i n ( v a l t x v a l t y , D i s t x + D i s t y ) ans+Min(\left | val_{tx}-val_{ty} \right |,Dis_{tx}+Dis_{ty})
就此,此题就轻松切掉啦!!!

Code

写得太丑了……还是不贴了吧。