hdu 2586 How far away? (LCA模板)
题意:
N个点,形成一棵树,边有长度。
M个询问,每个询问(a,b),询问a和b的距离
思路:
模板题,看代码。DFS预处理算出每个结点离根结点的距离。
注意:
qhead[maxn],而不是qhead[maxm]。
输出用%I64d,不要用%lld。
C++ RE后 尝试用 G++交。
代码:
struct node{int to,w,next,lca; }; int const maxn = 40005; int const maxm = 205; int fa[maxn]; int head[maxn], qhead[maxn]; int cnt1,cnt2; ll d[maxn]; ll res[maxm*2]; bool vis[maxn];node edge[2*maxn]; node qedge[2*maxm];int n,m;int findFa(int x){return fa[x]==x?x:fa[x]=findFa(fa[x]); } inline void Addedge(int u,int v,int w){edge[++cnt1].w=w, edge[cnt1].to=v, edge[cnt1].next=head[u], head[u]=cnt1;edge[++cnt1].w=w, edge[cnt1].to=u, edge[cnt1].next=head[v], head[v]=cnt1; } inline void Addqedge(int u,int v){qedge[++cnt2].to=v, qedge[cnt2].next=qhead[u], qhead[u]=cnt2;qedge[++cnt2].to=u, qedge[cnt2].next=qhead[v], qhead[v]=cnt2; } void dfs(int u,int fa,ll w){d[u]=w;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v==fa) continue;dfs(v,u,w+edge[i].w);} } void Tarjan_LCA(int u){fa[u]=u, vis[u]=true;for(int i=head[u];i!=-1;i=edge[i].next){if(!vis[edge[i].to]){ //防止访问到父亲 Tarjan_LCA(edge[i].to);fa[edge[i].to]=u;}}for(int i=qhead[u];i!=-1;i=qedge[i].next){if(vis[qedge[i].to]){qedge[i].lca=findFa(qedge[i].to);res[i]=d[u]+d[qedge[i].to]-2*d[qedge[i].lca];}} } void init(){rep(i,1,n) fa[i]=i;mem(head,-1); mem(qhead,-1); mem(vis,false); mem(d,0); mem(res,0);cnt1=cnt2=0; }int T,a,b,w; int main(){cin>>T;while(T--){scanf("%d%d",&n,&m);init();rep(i,1,n-1){scanf("%d%d%d",&a,&b,&w);;Addedge(a,b,w);}rep(i,1,m){scanf("%d%d",&a,&b);Addqedge(a,b);}dfs(1,-1,0);Tarjan_LCA(1);for(int i=1;i<=cnt2;i+=2){if(res[i])printf("%I64d\n",res[i]);elseprintf("%I64d\n",res[i+1]);}} }
转载于:https://www.cnblogs.com/fish7/p/4006426.html
hdu 2586 How far away? (LCA模板)相关推荐
- HDU - 2586 How far away LCA+tanjar离线算法
传送门 题意:求树上的两点的距离,放在一棵树上,而且题目提示只有一条,很明显是这条路线一定会经过他们的最近公共祖先啦,然后就是一个求距离的问题了.如果要采用离线算法的话,就是通过处理所有询问,那么肯定 ...
- HDU - 4547 CD操作(LCA模板)
题目链接:点击查看 题目大意:给出一个层层嵌套的树状结构,可以从某一点通过一个操作直接到达任意一个子节点的位置,但如果要从某个节点到达其祖先节点需要一层一层往上爬,问若要从节点A到达节点B,需要多少步 ...
- LCA模板(数剖实现)
题目链接:https://www.luogu.org/problemnew/show/P3379 题意:LCA模板题. 思路:今天开始学树剖,先拿lca练练.树剖解lca,两次dfs复杂度均为O(n) ...
- 51nod 2621 树上距离 (倍增+ LCA 模板)
51nod 2621 树上距离 (倍增+ LCA 模板) 有一棵n个节点的无向树,每条边有一个边权,现在有q次询问,每次询问给出两个点,求这两个点之间的简单路径上的边权和是多少. 输入格式 第1行:两 ...
- *【HDU - 2586】How far away ? (LCA模板题,倍增)
题干: There are n houses in the village and some bidirectional roads connecting them. Every day peole ...
- hdu 2586 How far away ?(LCA模板)(倍增法)
在dfs的过程中维护三个数组: deep[i],表示i点在树中的深度: grand[x][i],表示x的第2^i个祖先的节点编号: dis[x][i],表示x到它2^i祖 #include< ...
- HDU 2586 How far away ?【LCA】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意: 无向图,给定边及边权重,任意两点之间都有一条唯一的道路,道路上每个点只能出现一次.给定 ...
- HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...
- hdu 2586(LCA + 节点间距离)
题意:给一棵树,询问u和v之间的边权和. 解题思路:找到u和v的最近公共祖先,它们之间的距离为dis[u]+dis[v]-2*dis[lca(u,v)] #include<iostream> ...
最新文章
- Flutter 网络请求库http
- linux 中 timeval结构体 - Neddy11 - 博客园
- html5父子页面数据传递,使用iframe标签嵌套页面时 如何进行父子页面通讯/传值...
- php和python性能-Node.js与PHP、Python的字符处理性能对比
- EonerCMS——做一个仿桌面系统的CMS(十一)
- jdby mysql_06_dljd_mysql数据库常用操作
- vscode正则表达式替换php数组,vscode正则替换
- 昇腾AI处理器软件栈--张量加速引擎(TBE)
- SpaceX计划2022年完成52次发射
- 数据结构基础学习之(串与数组)
- 【OpenCV】矩阵掩模操作
- xmpppy获取服务器版本信息,为什么XMPP? - 今幕明的个人页面 - OSCHINA - 中文开源技术交流社区...
- android.dig机器人采访,机器人学导论心得 - osc_jjc36t9p的个人空间 - OSCHINA - 中文开源技术交流社区...
- 新浪微博批量删除微博方法
- [附源码]Python计算机毕业设计Django大学生考勤管理系统论文
- 股票-每日复盘-5-24
- 微信小程序编译不通过,报message:Error: app.json: app.json 未找到的错误
- 腾讯云 mysql 远程_腾讯云服务器 MySQL 远程连接设置
- 6.IT服务运营管理
- 数据骗子无处不在,教你拆穿所谓“万金油”