BZOJ 2125 最短路 静态仙人掌

本文介绍如何解决BZOJ 2125题目的最短路问题,针对静态仙人掌图,利用Tarjan算法处理环,并通过构建新树结构,结合倍增LCA方法来确定两点间最短路径。在实践中遇到的问题,如LCA位于环上,导致最短距离可能由环的任意一段构成,通过调整树结构得以解决。
摘要由CSDN通过智能技术生成

题目大意:给定一棵仙人掌,多次询问两点之间的最短路

静态仙人掌= = 在VFK讲仙人掌之前就想做= = 结果一直拖= =

好不容易写完了= = 刚过样例 BZ就开始维护- - 维护到闭营= = 交上去还WA了= = 尼玛我这傻逼到底还是把倍增LCA写挂了= =

算了回归正题


首先我们的思路是这样的

考虑给定的是一棵树 多次询问树上两点间距离 

那么我们一般的做法是预处理每个点到根的距离 用两点到根距离之和减掉LCA到根距离的2倍

那么到了仙人掌上我们也可以套用这个做法


首先Tarjan处理出每个环 处理出环上每个点到根节点的最短路

但是有一个问题 如果LCA在环上的话环上的最短距离可能是这个环被分成的两段中的任意一段

因此我们另建一棵树

在这棵树上 对于每个环我们定义深度最小的点为这个环的根

每个环变成一个节点连向环的根 环上其他节点连向这个环

因此如果两个点的LCA是环 就会出现这种情况 在两端之中选择短的一条即可


具体实现啥的= = 各种STL啥的真是对不起了= = 反正这种数据范围怎么可能卡常嘛啊哈哈哈= =

#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 10100
#define INF 0x3f3f3f3f
using namespace std;

int n,m,q,cnt;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值