ST和LCA和无根树连接
#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和无根树连接的更多相关文章
- ST&倍增LCA
回顾st算法,它的一大功能是求区间最值.先将整个区间划分成若干个小的区间,求出最值,然后将小的区间合并成一个大的区间,我们这里要用到一个数组minn[i][j],划重点!如果我们要求的是区间最小值,m ...
- 51Nod1766 树上的最远点对 ST表 LCA 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1766.html 题目传送门 - 51Nod1766 题意 n个点被n-1条边连接成了一颗树,给出a~ ...
- hdu 2874 Connections between cities(st&rmq LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 倍增小结 ST 与 LCA
倍增 倍增我是真滴不会 倍增法(英语:binary lifting),顾名思义就是翻倍. 能够使线性的处理转化为对数级的处理,大大地优化时间复杂度. (ps:上次学倍增LCA,没学会,老老实实为了严格 ...
- st表 LCA
我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把 ...
- LCA统计
读入挂 inline void read(int &v) { v = ; ; ; ') { if (c == '-') { p = -; } c = getchar(); } ') { v = ...
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...
- HDU 3078 (LCA+树链第K大)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3078 题目大意:定点修改.查询树中任意一条树链上,第K大值. 解题思路: 先用离线Tarjan把每个 ...
- 使用JDBC连接操作数据库
JDBC简介 Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成. JDBC ...
随机推荐
- [洛谷P1726][codevs1332]上白泽慧音
题目大意:求一个有向图的最大强连通分量中点的个数,并输出这些点(字典序最小). 解题思路:裸的强连通分量. 数据小,求完强连通分量后排序+vector大小比较即可(vector有小于运算符). C++ ...
- [NOIP2015提高组]子串
题目:洛谷P2679.Vijos P1982.codevs4560.UOJ#149. 题目大意:有长度为n的A串和长度为m的B串.现在要从A串中取出k个互不重叠的子串,使它们按顺序相连后得到B串.问有 ...
- 【Codeforces Round #422 (Div. 2) B】Crossword solving
[题目链接]:http://codeforces.com/contest/822/problem/B [题意] 让你用s去匹配t,问你最少需要修改s中的多少个字符; 才能在t中匹配到s; [题解] O ...
- 【转】30分钟掌握 C#6
[转]30分钟掌握 C#6 1. 只读自动属性(Read-only auto-properties) C# 6之前我们构建只读自动属性: public string FirstName { get; ...
- hadoop1.0.3学习笔记
回 到 目 录 最近要从网上抓取数据下来,然后hadoop来做存储和分析. 呆毛王赛高 月子酱赛高 小唯酱赛高 目录 安装hadoop1.0.3 HDFS wordcount mapreduce去重 ...
- leetCode 36.Valid Sudoku(有效的数独) 解题思路和方法
Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...
- Unix网络编程之环境搭建
环境搭建 在尝试UNP书上的样例时,会由于找不到"unp.h"等问题无法编译成功.因此在学习之前须要先搭建好编译环境. 步骤 <1>下载 UNIX网络编程源码unpv ...
- 使用maven运行单元測试总结
maven本身没有单元測试框架,可是maven的default生命周期的test阶段绑定了maven-surefire-plugin插件,该插件能够调用Junit3.Junit4.TestNG等Jav ...
- centos7 双网卡设置(先NAT和后桥接)
摘要:VMware中搭建一台虚拟机192.168.161.5(NAT转发) 首先在VM虚拟机设置里面添加一块网卡适配器 设置为桥接模式 完成后等待自动配置 此时出现多了一个ens37 和本地网段一样的 ...
- CSS的水平居中和垂直居中解决方案
在写CSS样式的时候,有时为了美观,会添加水平居中和垂直居中,这时候你有可能会遇到很棘手的问题,有些水平居中和垂直居中的属性添加上去完全没反应,下面给大家列举一些CSS水平居中和垂直居中的终极解决方案 ...