gmoj 1914. 【2011集训队出题】最短路

这篇博客介绍了如何解决一个关于最短路径的问题,其中图是一个连通无向图,每条边最多属于一个环。通过建立圆方树和仙人掌图的概念,博主提供了两种解决方案:一是使用圆方树的裸题解法,二是通过将仙人掌图转化为树并利用SPFA算法找到最短路径。在数据约束下,N的最大值为10000,Q的最大值为10000。
摘要由CSDN通过智能技术生成

题目描述

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,SumOfCircledi

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值