可用倍增LCA解题
http://codevs.cn/problem/2370/
#include<bits/stdc++.h>
using namespace std;
const int M=5e4+;
const int N=;
struct node{
int v,w;
node(int vv=,int ww=):v(vv),w(ww){}
};
vector<node>e[M];
int n,grand[M][N],dis[M][N],deep[M],book[M],root,s;
void dfs(int u){
for(int i=;i<=s;i++){
grand[u][i]=grand[grand[u][i-]][i-];
dis[u][i]=dis[u][i-]+dis[grand[u][i-]][i-];
if(!grand[u][i])
break;
}
for(int i=;i<e[u].size();i++){
int v=e[u][i].v;
if(v!=grand[u][]){
grand[v][]=u;
deep[v]=deep[u]+;
dis[v][]=e[u][i].w;
dfs(v);
}
}
}
void init(){
s=floor(log(1.0*n)/log(2.0));
deep[]=-;
dfs(root);
}
int LCA(int a,int b){
if(deep[a]>deep[b])
swap(a,b);
int ans=;
for(int i=s;i>=;i--){
if(deep[a]<deep[b]&&deep[a]<=deep[grand[b][i]])
ans+=dis[b][i],b=grand[b][i];
}
for(int i=s;i>=;i--){
if(grand[a][i]!=grand[b][i])
ans+=dis[a][i],ans+=dis[b][i],a=grand[a][i],b=grand[b][i];
}
if(a!=b)
ans+=dis[a][]+dis[b][];
return ans;
}
int main(){ scanf("%d",&n);
for(int i=;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u++;
v++;///fu
book[u]=;
e[u].push_back(node(v,w));
e[v].push_back(node(u,w));
}
for(int i=;i<=n;i++){
if(!book[i]){
root=i;
break;
}
}
init();
int m;
scanf("%d",&m);
while(m--){
int u,v;
scanf("%d%d",&u,&v);
u++,v++;
printf("%d\n",LCA(u,v));
}
return ;
}
http://codevs.cn/problem/1036/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int M=3e4+;
const int N=;
struct node{
int v,w;
node(int vv=,int ww=):v(vv),w(ww){}
};
vector<node>e[M];
int s,grand[M][N],dis[M][N],book[M],deep[M],root,n;
void dfs(int u){
for(int i=;i<=s;i++){
grand[u][i]=grand[grand[u][i-]][i-];
dis[u][i]=dis[u][i-]+dis[grand[u][i-]][i-];
if(!grand[u][i])
break;
}
for(int i=;i<e[u].size();i++){
int v=e[u][i].v;
if(v!=grand[u][]){
grand[v][]=u;
deep[v]=deep[u]+;
dis[v][]=e[u][i].w;
dfs(v);
} // cout<<"!!"<<endl;
}
}
void init(){
s=floor(log(1.0*n)/log(2.0));
deep[]=-;
dfs(root);
}
int LCA(int a,int b){
if(deep[a]>deep[b])
swap(a,b);
int ans=;
for(int i=s;i>=;i--){
if(deep[b]>deep[a]&&deep[a]<=deep[grand[b][i]])
ans+=dis[b][i],b=grand[b][i];
}
for(int i=s;i>=;i--)
if(grand[a][i]!=grand[b][i])
ans+=dis[a][i]+dis[b][i],b=grand[b][i],a=grand[a][i];
if(a!=b)
ans+=dis[a][]+dis[b][];
return ans;
}
int main(){ scanf("%d",&n);
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
book[v]=;
e[u].push_back(node(v,));
e[v].push_back(node(u,));
}
for(int i=;i<=n;i++)
if(!book[i]){
root=i;
break;
} init();
int m,u,v;
scanf("%d",&m);
scanf("%d",&u);
int ans=;
for(int i=;i<m;i++){
scanf("%d",&v);
ans+=LCA(u,v);
u=v;
}
printf("%d\n",ans);
return ;
}
http://oj.fjaxyz.com:3389/problem.php?id=223
当LCA(a,b)==a时才能参赛
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int M=1e4+;
struct node{
int v;
ll w;
node(int vv=,ll ww=):v(vv),w(ww){}
};
vector<node>e[M];
int grand[M][],s,n,root,deep[M];
ll dis[M][],num,numt;
void dfs(int u){
for(int i=;i<=s;i++){
grand[u][i]=grand[grand[u][i-]][i-];
dis[u][i]=dis[u][i-]+dis[grand[u][i-]][i-];
if(!grand[u][i])
break;
}
for(int i=;i<e[u].size();i++){
int v=e[u][i].v;
if(v!=grand[u][]){
grand[v][]=u;
deep[v]=deep[u]+;
dis[v][]=e[u][i].w;
dfs(v);
}
}
}
void init(){
s=floor(log(1.0*n)/log(2.0));
deep[]=-;
dfs(root);
}
void LCA(int u,int v){
int a=u,b=v;
if(deep[a]>deep[b])
swap(a,b) ;
ll ans=;
for(int i=s;i>=;i--){
if(deep[b]>deep[a]&&deep[a]<=deep[grand[b][i]])
ans+=dis[b][i],b=grand[b][i];
}
for(int i=s;i>=;i--){
if(grand[b][i]!=grand[a][i])
ans+=dis[b][i]+dis[a][i],a=grand[a][i],b=grand[b][i];
}
if(a!=b)
ans+=dis[a][]+dis[b][],a=grand[a][],b=grand[b][];
if(a!=u)
return ;
// cout<<"!!"<<endl; numt+=ans;
num++;
}
int main(){
int m;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
e[u].push_back(node(v,w));
e[v].push_back(node(u,w));
}
root=;
init();
while(m--){
int u,v;
scanf("%d%d",&u,&v); LCA(u,v);
}
printf("%d\n",num);
printf("%d\n",numt); return ;
}
zoj 3198
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3320
吐槽一下输出格式,言不表意!!
题意:求用最小权值的路径连接起3个节点,问这些路径的和;
分析,答案就是俩俩之间路径和/2;
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int M=5e4+;
struct node{
int v,w;
node(int vv,int ww):v(vv),w(ww){}
};
vector<node>e[M];
int grand[M][],dis[M][],deep[M],root,s,n,book[M];
void dfs(int u){
for(int i=;i<=s;i++){
grand[u][i]=grand[grand[u][i-]][i-];
dis[u][i]=dis[grand[u][i-]][i-]+dis[u][i-];
if(!grand[u][i])
break;
}
for(int i=;i<e[u].size();i++){
int v=e[u][i].v;
if(v!=grand[u][]){
grand[v][]=u;
deep[v]=deep[u]+;
dis[v][]=e[u][i].w;
dfs(v);
}
}
}
void init(){
s=floor(log(1.0*n)/log(2.0));
deep[]=-;
dfs(root);
}
int LCA(int a,int b){
if(deep[a]>deep[b])
swap(a,b);
int ans=;
for(int i=s;i>=;i--){
if(deep[a]<deep[b]&&deep[a]<=deep[grand[b][i]])
ans+=dis[b][i],b=grand[b][i];
}
for(int i=s;i>=;i--){
if(grand[a][i]!=grand[b][i])
ans+=dis[a][i]+dis[b][i],a=grand[a][i],b=grand[b][i];
}
if(a!=b)
ans+=dis[a][]+dis[b][];
return ans;
}
int main(){
int flag=;
while(~scanf("%d",&n)&&n){
if(flag)
flag=;
else
printf("\n");
for(int i=;i<=n;i++){
e[i].clear();
deep[i]=;
book[i]=;
for(int j=;j<=;j++)
grand[i][j]=dis[i][j]=; }
for(int i=;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u++;
v++;
book[v]=;
e[u].push_back(node(v,w));
e[v].push_back(node(u,w));
}
for(int i=;i<=n;i++){
if(!book[i]){
root=i;
break;
}
}
init();
int m;
scanf("%d",&m);
while(m--){
int u,v,k;
scanf("%d%d%d",&u,&v,&k);
u++,v++,k++;
int ans=;
ans+=LCA(u,v);
// cout<<LCA(u,v)<<"~~~~~~~~1"<<endl;
ans+=LCA(u,k);
// cout<<LCA(u,k)<<"~~~~~~~~2"<<endl;
ans+=LCA(v,k);
// cout<<LCA(k,v)<<"~~~~~~~~3"<<endl;
printf("%d\n",ans/);
} }
return ;
}
可用倍增LCA解题的更多相关文章
- [板子]倍增LCA
倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- Gym100685G Gadget Hackwrench(倍增LCA)
题目大概说一棵边有方向的树,q个询问,每次询问结点u是否能走到v. 倍增LCA搞即可: 除了par[k][u]表示u结点往上走2k步到达的结点, 再加上upp[k][u]表示u结点往上走2k步经过边的 ...
- Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]
题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...
- hdu 4674 Trip Advisor(缩点+倍增lca)
花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- codevs 1036 商务旅行 (倍增LCA)
/* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include<iostream> #include<cstdio> #include<cs ...
- hdu 2586 How far away ?倍增LCA
hdu 2586 How far away ?倍增LCA 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路: 针对询问次数多的时候,采取倍增 ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
随机推荐
- 文献阅读报告 - Situation-Aware Pedestrian Trajectory Prediction with Spatio-Temporal Attention Model
目录 概览 描述:模型基于LSTM神经网络提出新型的Spatio-Temporal Graph(时空图),旨在实现在拥挤的环境下,通过将行人-行人,行人-静态物品两类交互纳入考虑,对行人的轨迹做出预测 ...
- unable to execute /bin/mv: Argument list too long
四种解决”Argument list too long”参数列表过长的办法 转自 http://hi.baidu.com/cpuramdisk/item/5aa49ce00c0757aecf2d4f2 ...
- 光纤卡网卡的区别以及HBA的常规定义-----引自百度百科
在讨论这个问题的时候,需要先说清楚一个问题:我们知道,在早期的SAN存储系统中,服务器与交换机的数据传输是通过光纤进行的,因为服务器是把SCSI指令传输到存储设备上,不能走普通LAN网的IP协议,所以 ...
- java程序无法连接Rabbitmq
java程序不能连接到rabbitmq,提示有包括501.403.402等错误. 各种调试都没用,后来是尝试新建一个用户,在配置文件中使用新用户连接,最后才使程序成功运行.
- css块级元素
<CSS权威指南>中文字显示:任何不是块级元素的可见元素都是内联元素.其表现的特性是“行布局”形式,这里的“行布局”的意思就是说其表现形式始终以行进行显示.比如,我们设定一个内联元素bor ...
- css伪元素::before与::after使用基础示例
1.指定文本前后添加内容 <div class="box">test</div> .box::before{ content: 'before'; marg ...
- “杀死”纸质名片!HiHello能重构商业关系网吗?
在当下的互联网时代,要添加好友去扩大自己的社交圈似乎是再简单不过.随便点击一个微信名片.与其他网友互相关注微博等,好像就又搭建了一个社交节点.暂且不讨论这些好友关系的质量问题,单是这样的方式并不适合于 ...
- 华为荣耀magic book(锐龙版)安装ubuntu系统
荣耀magic book锐龙版性价比很高,前段时间在朋友推荐下我自己也入手了一台.机器整体感觉不错,续航时间长(办公.无线上网5-6小时吧),速度快,买的时候4300,现在已经降到4000以下了,也算 ...
- elasticsearch-集群管理
1.集群结构 ES 通常以集群方式工作.以提高搜索性能.容错能力.高可用.实现PB级数据搜索. 相关概念: (1)结点: ES集群由多台ES服务器组成.每个ES 服务端就是个一个NODE结点 (2)分 ...
- 主导SEO成败的关键是细节的布局,细数SEO三大布局思路
有的人认为SEO操作就类似车间工作,有一个完整的流程,整套流程下来网站就会有一个好的排名.这样是不对的,优化的着重点是要有一个好的思维,技巧和策略,把这些着重点相结合的运用到SEO优化中,很大的机率会 ...