#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. Centos7(阿里云服务器)安装Anaconda的详细步骤与心得

    在本地安装Anaconda的各个版本的文章已经很多,但是感觉不是很详细,因此,在此发发自己在Centos7(阿里云服务器)安装Anaconda的心得和步骤: 注:需要注意的地方会用不同颜色区别. 1. ...

  2. dmesg---检查和控制内核的环形缓冲区

    dmesg命令被用于检查和控制内核的环形缓冲区.kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看.开机信息保存在/var/log/dmesg文 ...

  3. Ehcache学习总结(3)--Ehcache 整合Spring 使用页面、对象缓存

    Ehcache 整合Spring 使用页面.对象缓存 Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式 ...

  4. hadoop1.0.3学习笔记

    回 到 目 录 最近要从网上抓取数据下来,然后hadoop来做存储和分析. 呆毛王赛高 月子酱赛高 小唯酱赛高 目录 安装hadoop1.0.3 HDFS wordcount mapreduce去重 ...

  5. elasticsearch搜索类型简单介绍

    简单搜索 GET请求很easy--你能轻松获取你想要的文档.让我们来进一步尝试一些东西.比方简单的搜索! 我们尝试一个最简单的搜索所有员工的请求: GET /megacorp/employee/_se ...

  6. how to backup and restore database of SQL Server

    Back up 1,右键选中需要备份的数据库,Tasks-->Backup 2.General中,Destination,先remove掉之前的,然后再Add 需要注意的是,add的文件,必须要 ...

  7. POJ 1459 最大流 第二题

    http://poj.org/problem?id=1459 也是网络流的基础,只是虚拟出一个源点和终点,对应的生产值和消费值就加到与源点和终点的边上,然后做一次bfs就好了. #include &l ...

  8. Json与JsonPath

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因为它良好的可读性与易于机器进行解析和生成等特性,在当前的数据整理和收集中得到了广泛的应用. JSON和XM ...

  9. React-router 4 总结

    React-Router 4: BrowserRouter包裹整个应用 Router路由对应渲染的组件,可嵌套 Link跳转专用 首先 然后 其他组件: url参数 Route组建参数可用冒号标识参数 ...

  10. angularjs 页面缓存及动态刷新解决方案

    一.准备工作 框架:angularjs ui组件库:ionic1 二.页面缓存cache 路由设置cache参数,true为缓存,false为不缓存,代码如下: angular.module('app ...