题目描述
Description
给一个N个点M条边的连通无向图,满足每条边最多属于一个环,有Q组询问,每次询问两点之间的最短路径。
Input
输入的第一行包含三个整数,分别表示N和M和Q
下接M行,每行三个整数v,u,w表示一条无向边v-u,长度为w
最后Q行,每行两个整数v,u表示一组询问
Output
输出Q行,每行一个整数表示询问的答案
Sample Input
9 10 2
1 2 1
1 4 1
3 4 1
2 3 1
3 7 1
7 8 2
7 9 2
1 5 3
1 6 4
5 6 1
1 9
5 7
Sample Output
5
6
Data Constraint
对于5%的数据,N<=100
对于20%的数据,N<=1000
对于100%的数据,N<=10000,Q<=10000
题解
Solution 1
圆方树裸题(然而我不会)
Solution 2
这应该是这题最水的解法了吧(好像是题解做法)!
发现这个仙人掌十分难搞,如果它是一棵树就容易处理了!
因此我们考虑怎么把仙人掌变成一棵树。
由于一条边最多只属于一个环,因此只用在每个环删除一条边,就可以变成一棵树了。
我们不妨以1号点为源点,跑一遍spfa,只保留那些更新到最短路的边,这就变成了一棵树。
这棵树有一个十分优良的性质:u,v两个点向上跳时,途经的所有环中,走树边是最优的(lca的那个环除外)
那么lca那个环怎么办呢?发现一个环只有2种走法,因此我们记录一下每一个环的边权和,用终点环的大小减去走树边的和,得出走非树边的路径长度。
可能上面的讲法有点晕,那么上一个图吧!
假设u和v是起点,lca,x,y在同一个环上,x和y是从u和v出发最先进入这个环的点,即u和v的祖先中最先在环上的2个点。
答案就是 d i s u − > x + d i s v − > y + min ( d i s x − > l c a + d i s y − > l c a , S u m O f C i r c l e − d i s x − > l c a − d i s y − > l c a ) dis_{u->x}+dis_{v->y}+\min({dis_{x->lca}+dis_{y->lca},SumOfCircle-dis_{x->lca}-dis_{y->lca}}) disu−>x+disv−>y+min(disx−>lca+disy−>lca,SumOfCircle−di