#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include<cstdio>
#include<vector>
#include<cmath>
#include <queue>
#include <map>
#include <vector>
#define ll __int64
#define mp make_pair<int, int>
using namespace std;
#define de(x) cout << #x << "=" << x << endl
const int maxn=50000+10;
int fa[maxn]={0};
int f[25][maxn]={0};
int len[25][maxn]={0};
int depth[maxn]={0};
vector<pair<int, int> > edge[maxn*2];
void dfs(int a)
{
depth[a]=depth[f[0][a]]+1;
for(int i=1;(1<<i)<=depth[a];i++)
{
f[i][a]=f[i-1][f[i-1][a]];
len[i][a]=len[i-1][f[i-1][a]]+len[i-1][a];
}
fa[a]=1;
for(int i=0;i<edge[a].size();i++)
{
int j=edge[a][i].first;
int k=edge[a][i].second;
if(!fa[j])
{
fa[j]=1;
f[0][j]=a;
len[0][j]=k;
dfs(j);
}
}
}
int ST(int a,int b)
{
int ans=0; if(depth[a]<depth[b]) swap(a,b);
for(int i=19,d=depth[a]-depth[b];i>=0;i--)
{
//cout<<"djfhjaksfhjkasfjk";
if(d>>i&1)//是一个&不是两个,因为这个wa了一个下午 ,ri!
{
//de(i);
ans+=len[i][a];
a=f[i][a];
}
}
//cout<<a<<" "<<b<<endl;
//cout<<ans<<endl;
if(a==b) return ans;
//cout<<ans<<endl;
//s=ceil(log(dep[x])/log(2));
for(int i=19;i>=0;i--)
{
if(f[i][a]!=f[i][b])
{
ans+=len[i][a];
a=f[i][a];
ans+=len[i][b];
b=f[i][b];
}
}
return ans+len[0][a]+len[0][b];
}
int main()
{
int n,m;
memset(fa,0,sizeof(fa));
memset(depth,0,sizeof(depth));
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int u,v,len;
scanf("%d %d %d",&u,&v,&len);
//cout<<u<<" "<<v<<" "<<len<<endl;
edge[u].push_back(mp(v,len));
//cout<<u<<" "<<v<<endl;
edge[v].push_back(mp(u,len));
//cout<<u<<" "<<v<<endl;
}
dfs(1);//因为是无根树,所以可以任取一个节点,作为根
//for(int i=1;i<=n;i++) cout<<depth[i]<<endl;
//for(int j=1;j<=n;j++) cout<<len[1][j]<<endl;
/*for(int i=19;(1<<i)<=depth[j];i--)
{
cout<<len[i][j]<<endl;
}*/
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d %d",&u,&v);
int ans=ST(u,v);
printf("%d\n",ans);
}
return 0;
}

题目连接:http://codevs.cn/problem/2370/

ST和LCA和无根树连接的更多相关文章

  1. ST&倍增LCA

    回顾st算法,它的一大功能是求区间最值.先将整个区间划分成若干个小的区间,求出最值,然后将小的区间合并成一个大的区间,我们这里要用到一个数组minn[i][j],划重点!如果我们要求的是区间最小值,m ...

  2. 51Nod1766 树上的最远点对 ST表 LCA 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1766.html 题目传送门 - 51Nod1766 题意 n个点被n-1条边连接成了一颗树,给出a~ ...

  3. hdu 2874 Connections between cities(st&rmq LCA)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  4. 倍增小结 ST 与 LCA

    倍增 倍增我是真滴不会 倍增法(英语:binary lifting),顾名思义就是翻倍. 能够使线性的处理转化为对数级的处理,大大地优化时间复杂度. (ps:上次学倍增LCA,没学会,老老实实为了严格 ...

  5. st表 LCA

    我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把 ...

  6. LCA统计

    读入挂 inline void read(int &v) { v = ; ; ; ') { if (c == '-') { p = -; } c = getchar(); } ') { v = ...

  7. 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

    前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...

  8. HDU 3078 (LCA+树链第K大)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3078 题目大意:定点修改.查询树中任意一条树链上,第K大值. 解题思路: 先用离线Tarjan把每个 ...

  9. 使用JDBC连接操作数据库

    JDBC简介 Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成. JDBC ...

随机推荐

  1. 帆软FineBI试用

    FineBI是帆软软件有限公司推出的一款商业智能(Business Intelligence)产品,FineBI的本质是通过分析企业已有的信息化数据,帮助企业发现并解决存在的问题,预测模拟企业将来的发 ...

  2. 试图切换控制addChildViewController、_transitionFromViewController

    试图切换能够用transitionFromViewController. 步骤: View Controller中能够加入多个sub view,在须要的时候显示出来: 能够通过viewControll ...

  3. 【 Beginning iOS 7 Development《精通iOS7开发》】05 Autorotation and Autosizing

    一.旋转后相对位置不变 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ29nbGVy/font/5a6L5L2T/fontsize/400/fill/I0 ...

  4. POJ 3070 Fibonacci 矩阵高速求法

    就是Fibonacci的矩阵算法.只是添加一点就是由于数字非常大,所以须要取10000模,计算矩阵的时候取模就能够了. 本题数据不强,只是数值本来就限制整数,故此能够0ms秒了. 以下程序十分清晰了, ...

  5. !HDU 2602 Bone Collector--DP--(裸01背包)

    题意:这题就是一个纯粹的裸01背包 分析:WA了好几次.01背包实现的一些细节没搞懂 1.为什么dp[i][j]赋初值为0而不是value[i].由于第i个石头可能不放! 2.在进行状态转移之前要dp ...

  6. CODE ---代码助手 (保存代码、搜代码、生成网页、自由界面)

    四大功能 1  保存代码 2  搜索代码 3  生成网页 4  自由界面 www.gudianxiaoshuo.com

  7. Firefox中使用pac

    https://campus.barracuda.com/product/websecurityservice/article/WSS/ConfigProxyWithPACFile/ https:// ...

  8. DataTable转成Json

    /// <summary>         /// DataTable转成Json /// </summary>         /// <param name=&quo ...

  9. 概率编程语言(Probabilistic Programming Languages)库 —— edward

    注意:tensorflow api 在 1.1.0 以后迎来重大变化,edward 的稳定版依赖于 tensorflow 1.1.0. edward是一个支持概率建模.推断的 Python 第三方库, ...

  10. HDU 5438 Ponds dfs模拟

    2015 ACM/ICPC Asia Regional Changchun Online 题意:n个池塘,删掉度数小于2的池塘,输出池塘数为奇数的连通块的池塘容量之和. 思路:两个dfs模拟就行了 # ...