hdu2586 倍增lca模板
来源:互联网 发布:淘宝开店考试答案 编辑:程序博客网 时间:2024/06/05 20:21
树上给出两个点,求两点的最短距离
#include <iostream>
using namespace std;#include <queue>
#include <string.h>
#include <string>
struct edges
{
int x,y,v;
int next;
}edge[100005];
int head[100005],num;
int p[50005][20],pow=18,d[50005],s[50005][20];
void add_edge(int x,int y,int v)
{
edge[num].x=x;
edge[num].y=y;
edge[num].v=v;
edge[num].next=head[x];
head[x]=num++;
}
void dfs(int pre,int now,int v)
{
int i;
d[now]=d[pre]+1;
p[now][0]=pre;
s[now][0]=v;
for(i=1;i<pow;i++)
{
p[now][i]=p[p[now][i-1]][i-1];
s[now][i]=s[now][i-1]+s[p[now][i-1]][i-1];
}
i=head[now];
while(i)
{
if(edge[i].y!=pre)
dfs(now,edge[i].y,edge[i].v);
i=edge[i].next;
}
}
int solve(int a,int b)
{
int i,j,sum=0;
if(d[a]<d[b]) a^=b , b^=a ,a^=b;
j=d[a]-d[b];
for(i=0;i<pow;i++)
if( (1<<i)&j ) sum+=s[a][i] , a=p[a][i];
if(a!=b)
{
for(i=pow-1;i>=0;i--)
if(p[a][i]!=p[b][i])
{
sum+=s[a][i]+s[b][i];
a=p[a][i] , b=p[b][i];
}
sum+=s[a][0]+s[b][0];
}
return sum;
}
void init()
{
memset(p,0,sizeof(p));
memset(head,0,sizeof(head));
memset(s,0,sizeof(s));
d[1]=1;
num=1;
}
int main()
{
int t,x,y,i,j,n,q;
cin>>t;
while(t--)
{
init();
cin>>n>>q;
for(i=1;i<n;i++)
{
cin>>x>>y>>j;
add_edge(x,y,j);
add_edge(y,x,j);
}
dfs(0,1,0);
while(q--)
{
cin>>x>>y;
cout<<solve(x,y)<<endl;
}
}
return 0;
}
阅读全文
0 0
- hdu2586 倍增lca模板
- LCA离线模板(Tarjan)倍增模板 hdu2586
- hdu2586 LCA模板
- LCA Tarjan模板 HDU2586
- 倍增法LCA hdu2586 How far away ?
- LCA离线+在线+hdu2586(模板)
- LCA倍增算法(模板)
- 倍增lca模板
- LCA倍增法模板
- 倍增LCA模板
- LCA倍增模板
- 倍增LCA 模板
- lca倍增算法模板
- {模板}LCA倍增
- LCA模板(倍增)
- 倍增LCA模板
- 倍增LCA模板
- 倍增LCA模板
- 生产者/消费者模式Java实现方式
- 反向代理 python twisted
- 调整方向,回归正规
- Diff Two Arrays
- java基础_函数Math.random()和Random的使用及区别
- hdu2586 倍增lca模板
- 【Scikit-Learn 中文文档】半监督学习
- ZOJ Problem Set
- eclipse配置黑色主题以及更多其他主题
- HDU 2669 Romantic 【exgcd】
- jquery实现标签提示
- 【Scikit-Learn 中文文档】概率校准
- 唯快不破:TCP/IP详解--网络层 && IP首部格式
- Java实现归并排序