题意:给一棵含n个结点的树,现要查询从a到b的路径中是否包含c,共q次查询。1=<n,q<=100000

分析:由于在树中从一个结点走到另一个结点的路径是唯一的,其实说的这条路径就是最短路径,然后问题转化为判断一个点是否为在一条最短路径上,此时就不难想到这个这个判断条件d(a,c)+d(c,b)=d(a,b),问题就转化为查询树中2个结点之间的距离,这个可以用LCA来做(参考上一篇),考虑到n和q都比较大,所以用离线LCA.

View Code

#include <stdio.h>
#include <string.h>
#define N 100010
#define M 200010
int n,q,e,eq;
int p[N],d[N];
int first[N],next[M],v[M];
int first_q[N],next_q[3*M],u_q[3*M],v_q[3*M],lca[3*M];
bool ok[3*M];
void make_set(int i)
{p[i]=i;
}
int find_set(int i)
{if(i^p[i])  p[i]=find_set(p[i]);return p[i];
}
void union_set(int i,int j)
{i=find_set(i),j=find_set(j);p[j]=i;
}
void init()
{e=eq=0;memset(first,-1,sizeof(first));memset(first_q,-1,sizeof(first_q));memset(p,-1,sizeof(p));memset(ok,0,sizeof(ok));memset(lca,0,sizeof(lca));
}
void add(int a,int b)
{v[e]=b;next[e]=first[a];first[a]=e++;
}
void add_q(int a,int b)
{u_q[eq]=a;v_q[eq]=b;next_q[eq]=first_q[a];first_q[a]=eq++;
}
void get_d(int a,int fa)
{int i,b;d[a]=d[fa]+1;for(i=first[a];i!=-1;i=next[i]){b=v[i];if(b!=fa)    get_d(b,a);}
}
void dfs(int a)
{int i,b;make_set(a);for(i=first[a];i!=-1;i=next[i]){b=v[i];if(p[b]==-1){dfs(b);union_set(a,b);}}for(i=first_q[a];i!=-1;i=next_q[i]) if(!ok[i]){b=v_q[i];if(p[b]!=-1)    lca[i]=find_set(b),ok[i]=true;}
}
int main()
{int a,b,c;while(~scanf("%d%d",&n,&q)){init();for(int i=0;i<n-1;i++){scanf("%d%d",&a,&b);add(a,b);add(b,a);}while(q--){scanf("%d%d%d",&a,&b,&c);add_q(a,b);add_q(a,c);add_q(b,c);add_q(b,a);add_q(c,a);add_q(c,b);}d[0]=-1;get_d(1,0);dfs(1);int dist[3];for(int i=0;i<eq;i+=6){for(int j=0;j<3;j++){a=u_q[i+j];b=v_q[i+j];c=lca[i+j];if(c==0)    c=lca[i+j+3];dist[j]=d[a]+d[b]-2*d[c];}if(dist[0]==dist[1]+dist[2])    puts("YES");else    puts("NO");}puts("");}return 0;
}

转载于:https://www.cnblogs.com/algorithms/archive/2012/08/03/2622409.html

COJ 1079 树上的查询 (离线LCA)相关推荐

  1. [蓝桥杯][2018年第九届真题]版本分支(离线LCA模板)

    题目描述 小明负责维护公司一个奇怪的项目.这个项目的代码一直在不断分支(branch)但是从未发生过合并(merge). 现在这个项目的代码一共有N个版本,编号1~N,其中1号版本是最初的版本. 除了 ...

  2. 51nod 2621 树上距离 (倍增+ LCA 模板)

    51nod 2621 树上距离 (倍增+ LCA 模板) 有一棵n个节点的无向树,每条边有一个边权,现在有q次询问,每次询问给出两个点,求这两个点之间的简单路径上的边权和是多少. 输入格式 第1行:两 ...

  3. 莫队 ---- 值域分块处理优化字典树上的查询 杭电多校2021第二场1004 i love counting

    题目链接 题目大意: 就是给你nnn个数,mmm次询问 每次询问给你l,r,a,bl,r,a,bl,r,a,b问你在[l,r][l,r][l,r]区间里面有多少种种种数c(XOR)a≤bc(XOR)a ...

  4. Hibernate的事务级别控制与查询对象的API(Query查询与Criterial查询+离线查询)

    1.事务级别控制 可以在Hibernate的配置文件中对事务进行配置.配置文件中,可以设置事务的隔离级别.其具体的配置方法是在hibernate.cfg.xml文件中的<session-fact ...

  5. F - Colorful Tree(LCA,树上差分,离线处理)

    F - Colorful Tree 给定一棵树,边有边权,且每条边有一个颜色,有mmm次操作, 每次给定x,y,u,vx, y, u, vx,y,u,v,如果把颜色为xxx的边,边权修改为yyy,求u ...

  6. 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)

    题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...

  7. sdcv: 在Ubuntu中使用命令行查询离线英文词典

    在Ubuntu中,通过**sdcv**可以在命令行终端环境中查询英文单词,词库以离线形式存在.**sdcv**是词典**StartDcit**的命令行终端版本. ### Installation 通过 ...

  8. 邮编查询/区号查询/证件查询 离线版/单机版

    受朋友之托,写了一个方便查询邮编的软件,在搜索框中直接粘贴输入完整地址,不用一个一个的去下拉框中选择, 便可跳出完整信息,闲来无事,顺便完善了一下,整个软件只有一个exe文件,完全精简化了,之前是存在 ...

  9. COJ 1006 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=979 WZJ的数据结构(六) 难度级别:D: 运行时间限制:1000ms: ...

  10. ST函数(ST表)RMQ O(1)查询 离线

    ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...

最新文章

  1. mysql+怎样查询最后几条_mysql 查询开头或最后几行
  2. 微信小程序——收起和查看更多功能
  3. 在python中构造时间戳参数的方法
  4. javascript / DOM、BOM、document、window 区别和联系
  5. Atitit.异步的实现模式attilax大总结
  6. 【OS学习笔记】二十九 保护模式八:任务切换对应的汇编代码之用户程序代码
  7. 函数式编程 模式_函数式编程模式:食谱
  8. 【安全】CDH集群开启Kerberos安全认证
  9. 湘潭大学 计算机学院程诗婕,云南大学学生获得2019CCF大学生计算机系统与程序设计竞赛西...
  10. python main调试_在main.py中调试显示这个是什么问题
  11. 内网分享文件html源码,vue项目分享html页面(服务器只能内网访问)
  12. 词法分析器java语言_Java语言词法分析器
  13. 一张图带你了解游戏程序员的学习之路
  14. Log4j2 CVE-2021-45046 鸡肋RCE漏洞复现与浅析
  15. 语音专题第三讲,语言模型
  16. unix_timestamp、from_unixtime时间戳函数的使用
  17. 阮一峰 / ES6 数组的解构赋值
  18. 九度OJ-1163:素数(未关联)
  19. 初中物理公式总结大全(pdf可下载)
  20. 【Unity学习笔记】Unity中的欧拉角(Euler Angle)和万向节(Gimbal)

热门文章

  1. 【原创手写笔记】面试准备,关于Adaboost GBDT算法你需要知道的那些
  2. 图神经网络GNN论文2019-2020顶会列表
  3. 【BERT】小学生级上手教程,从原理到上手全有图示,还能直接在线运行
  4. NLP硬核入门-隐马尔科夫模型HMM
  5. 【科研】施一公:我有6个办法提高英文科研写作能力
  6. 干货 | 我如何考察面试者的机器学习水平
  7. 损失函数——交叉熵由来
  8. 实时Web与WebSocket实践
  9. NFC:Arduino、Android与PhoneGap近场通信
  10. 什么是Windows Azure