LCA
来源:互联网 发布:淘宝怎么设置新品上架 编辑:程序博客网 时间:2024/06/06 04:05
#include <iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<cmath>using namespace std;const int maxn=40010;struct node{ int to,next,w;}edge[maxn<<1];int head[maxn],cnt;void addedge(int u,int v,int we){ edge[cnt].to=v ; edge[cnt].next=head[u]; edge[cnt].w=we; head[u]=cnt++;}bool vis[maxn];int dis[maxn];int deep[maxn<<1];int ver[maxn<<1];int pos[maxn];int tot=0;void dfs(int u,int step){ vis[u]=true; ver[++tot]=u;pos[u]=tot;deep[tot]=step; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; int w=edge[i].w; if(!vis[v]) { dis[v]=dis[u]+w; dfs(v,step+1); ver[++tot]=u,deep[tot]=step; } }}int dp[maxn<<1][30];void st(int n){ int k=(int)(log((double)n)/log(2.0)); for(int i=1;i<=n;i++) dp[i][0]=i; for(int j=1;j<=k;j++) { for(int i=1;i+(1<<j)-1<=n;++i) { int x=dp[i][j-1],y=dp[i+(1<<(j-1))][j-1]; if(deep[x]<deep[y]) dp[i][j]=x; else dp[i][j]=y; } }}int lca(int x,int y){ int a=pos[x],b=pos[y]; if(a>b) swap(a,b); int k=(int)(log((double)(b-a+1))/log(2.0)); int l=dp[a][k],r=dp[b-(1<<k)+1][k]; return deep[l]<deep[r] ? ver[l]: ver[r];}void init(){ cnt=0; tot=0; memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis));}int main(){ int T; scanf("%d",&T); while(T--) { init(); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<n;++i) { int u,v,w; scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); addedge(v,u,w); } dfs(1,1); st(tot); while(m--) { int u,v; scanf("%d%d",&u,&v); long long ans=dis[u]+dis[v]-2*dis[lca(u,v)]; printf("%I64d\n",ans); } } return 0;}
阅读全文
0 0
- LCA
- LCA
- lca
- LCA
- LCA
- lca
- LCA
- LCA
- LCA
- LCA
- LCA
- lca
- lca
- LCA
- lca
- LCA
- LCA
- LCA
- 初识多线程
- Web移动端布局的那些事儿
- supervise系统进程监控
- ARP协议在同网段及跨网段下的工作原理
- 《数据结构实战》------------------------ 一个二叉堆的实现
- LCA
- Android SeekBar(拖动条)
- 加载配置文件
- redis学习 基础篇(二) php操作redis
- 【学习大作战】Intent和Intent-filter详解
- iOS Hacker dumpdecrypted脱壳
- Zend Studio 12.0.1 汉化方法及破解文件
- OtterTune来了,DBA怎么办
- maven创建完成之后不显示 src/main/java