题目链接:P3398 仓鼠找 sugar - 洛谷 | (luogu.com.cn)

题目大意:判定一棵树上的两条边是否相交

Tag:

[LCA] [树上两点间距离的计算] [如何判断与点在某条路径上]

思路:

\[\begin{align}
&1.建图\\
&2.\text{dfs}然后\ 计算出每个点的深度 和计\text{anc}(i,j)\\
&3.根据树上路径唯一的性质 \quad 如果一个点在某条边上\\
&那么u到边的两端点的距离\text{dis}(a,b) = \text{dis}(a,u)+\text{dis}(u,b)\\
&\text{dis}(a,b) = \text{depth}(a)+\text{depth}(b)-2\times\text{depth}(c)\\
& 其中c=\text{LCA}(a,b)

\end{align}
\]

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=2e5+9;
const int LOG = log2(N)+1;
int idx=0,head[N];
struct node{
int to,val,next;
};
node e[N<<1];
bool vis[N];
int fa[N];
int anc[N][LOG];
int depth[N];
int n,Q;
int logn;
void add(int u,int v,int val){
e[idx] = {v,val,head[u]};
head[u] = idx++;
}
void bd(){
cin>>n>>Q;
logn = log2(n);
memset(head,-1,sizeof(head));
for(int i=1 ; i<=n-1 ; ++i){
int u,v;
cin>>u>>v;
add(v,u,0);
add(u,v,0);
}
}
void dfs(int u,int fa){
anc[u][0]=fa;
for(int i=head[u] ; i!=-1 ; i=e[i].next){
int v = e[i].to;
if(v==fa) continue;
depth[v] = depth[u] +1;
dfs(v,u);
}
}
void init(){
for(int j=1 ; j<=logn ;++j){
for(int i=1 ; i<=n; ++i){
int v = anc[i][j-1];
anc[i][j] = anc[v][j-1];
}
}
}
int LCA(int u,int v){
if(u==v) return u;
if(depth[v] > depth[u])
swap(u,v);
for(int i=logn ; i>=0; --i){
if( depth[u] -(1<<i) >= depth[v])
u =anc[u][i];
}
if(u == v) return u; for(int i=logn ; i>=0; --i){
if(anc[u][i] != anc[v][i] ){
u = anc[u][i];
v = anc[v][i];
}
}
return anc[u][0];
}
bool check(int a,int b,int c,int d){
if(a==c || a==d || b==c || b==d ) return true;
return false;
}
int dis(int a,int b){
int c = LCA(a,b);
return depth[a]+depth[b]-2*depth[c];
//return abs(depth[a]-depth[c])+abs(depth[b]-depth[c]);
}
int main(){
bd();
dfs(1,0);
init();
for(int i=1 ; i<=Q ; ++i){
int a,b,c,d;
cin>>a>>b>>c>>d;
if(check(a,b,c,d)) cout<<"Y"<<"\n";
else {
int len1 = dis(a,b);
int len2 = dis(c,d);
int join1 = LCA(a,b);
int join2 = LCA(c,d);
if( ( dis(a,join2) + dis(b,join2) ==len1 ) || ( dis(d,join1) + dis(c,join1) ==len2) )
cout << "Y" << "\n";
else
cout << "N" << "\n"; // 确保输出结果
}
}
}

【LCA 树上两点的距离 判定点是否在某条边中】洛谷P3398 仓鼠找sugar的更多相关文章

  1. 洛谷P3398 仓鼠找sugar [LCA]

    题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  2. 洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交

    [题解] 题意就是判断树上两条链是否有交.口诀是“判有交,此链有彼祖”.即其中一条链的端点的Lca在另一条链上. 我们设两条链的端点的Lca中深度较大的为L2,对L2与另一条链的两个端点分别求Lca, ...

  3. 【洛谷】【lca+结论】P3398 仓鼠找sugar

    [题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...

  4. P3398 仓鼠找sugar (一道LCA的裸题)

    https://www.luogu.org/problemnew/show/P3398 题意简单概括一下就是求树上两条路径是否相交; 有这样一个性质: if相交,则必有lca(a,b) 在路径c &l ...

  5. P3398 仓鼠找sugar[LCA]

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  6. 洛谷10月月赛Round.1| P3398 仓鼠找sugar[LCA]

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  7. luogu P3398 仓鼠找sugar [LCA]

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  8. p3398 仓鼠找sugar (LCA+讨论)

    分情况讨论,结果是两条路径有公共点时,深度大的LCA在另一条路径上且另一条路径的两个端点至少其中一个的与深度大的LCA的LCA为那个深度大的LCA #include <cstdio> #i ...

  9. P3398 仓鼠找sugar 树上路径相交判断

    \(\color{#0066ff}{题目描述}\) 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐 ...

  10. 仓鼠找sugar(lca)

    洛谷——P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅( ...

随机推荐

  1. 时间格式化转换及时间比较compareTo,Controller层接收参数格式化,从数据源头解决时间格式错误数据对接口的影响

    时间格式化转换及时间比较compareTo,Controller层接收参数格式化,从数据源头解决时间格式错误数据对接口的影响 /** * 时间格式的转换:在具体报错的地方做转换,可能不能从根本上面解决 ...

  2. maven依赖关系及打包及阿里云仓库地址

    https://developer.aliyun.com/mvn/search 阿里云仓库地址,可以搜索 <repositories> <repository> <id& ...

  3. Python3 dict和str互转

    # Python3 dict和str互转 import ast str_of_dict = "{'key1': 'key1value111', 'key2': 'key2value222'} ...

  4. 解析下载blob视频

    前言 浏览器中有些视频是通过blob:https://baike.baidu.com/bf834217-9442-4c98-9ef6-0bd5f3408a4e的形式给出的.blob后面的网址不能直接访 ...

  5. Android 中的property_get/property_set

    Android 中的property_get/property_set 背景 在安卓中调试Linux驱动层以及应用层之间的一些功能时,需要获取一些属性. 参考: https://blog.csdn.n ...

  6. 在win10上安装MTK驱动(附驱动下载链接)

    参考:https://www.cnblogs.com/keepgoing707/p/4926171.html 背景 在调试MTK平台MT67XX的时候,发现安装preloader驱动装不上. 第三方i ...

  7. Freertos学习:01 移植到STM32

    --- title: rtos-freertos-01-移植到STM32 EntryName: rtos-freertos-01-porting-on-stm32 date: 2020-06-17 1 ...

  8. tcp_tw_reuse、tcp_tw_recycle、tcp_fin_timeout参数介绍

    参数介绍 net.ipv4.tcp_tw_reuse = 1 表示开启重用.允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭: net.ipv4.tcp_tw_rec ...

  9. 【Mysql】Mysql字符集CHARACTER和COLLATE

    一:设置服务器默认字符集为 utf8mb4 创建数据库时,如果没有指定字符集,会采用服务器的默认字符集.设置服务器默认字符集为 utf8mb4 可以提高便利性. 编辑 MySQL 的配置文件,修改服务 ...

  10. Django中的函数make_password、set_password和check_password

    在Django中,有一些用于处理密码的常用函数,包括make_password.set_password和check_password.这些函数用于生成.设置和验证密码,但没有直接的get_passw ...