题目链接:点击查看

题目分析:给出n个节点组成的一棵树,每条边都有一个权值w,现在给出m个询问,每次询问需要回答点x到点y之间的距离之和

题目分析:因为看到了两点之间的距离之和,一开始是想直接上树链剖分,然后线段树维护的,但转念一想,其实可以直接用一个树上前缀和来维护的,dfs的时候顺便把前缀和维护一下,sum[v]=sum[u]+w,表示的是节点v到根节点的前缀和,虽然题目给出的是一个无根树,但是我们可以随便设置一个节点当做根节点,不会影响到最终答案的

维护完前缀和后对于两个点跑一下lca然后直接求答案就好了,因为权值是在边上,所以直接sum[x]+sum[y]-2*sum[lca]就好了

这个题目的数据我一开始是有点怕爆int,因为2*1.6*1e9已经爆掉int了,所以我把上面的式子稍微换了一下顺序,就不用担心了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=4e4+100;struct Node
{int to,w;Node(int TO,int W){to=TO;w=W;}
};vector<Node>node[N];int n,m,limit;int sum[N];int deep[N],dp[N][20];void dfs(int u,int f,int dep)
{deep[u]=dep;dp[u][0]=f;for(int i=1;i<=limit;i++)dp[u][i]=dp[dp[u][i-1]][i-1];for(auto i:node[u]){int v=i.to;int w=i.w;if(v==f)continue;sum[v]=sum[u]+w;dfs(v,u,dep+1);}
}int LCA(int x,int y)
{if(deep[x]<deep[y])swap(x,y);for(int i=limit;i>=0;i--)if(deep[x]-deep[y]>=(1<<i))x=dp[x][i];if(x==y)return x;for(int i=limit;i>=0;i--)if(dp[x][i]!=dp[y][i]){x=dp[x][i];y=dp[y][i];}return dp[x][0];
}void init()
{sum[1]=0;for(int i=1;i<=n;i++)node[i].clear();limit=log2(n)+1;
}int main()
{
//  freopen("input.txt","r",stdin);
//    ios::sync_with_stdio(false);int w;cin>>w;while(w--){scanf("%d%d",&n,&m);init();for(int i=1;i<n;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);node[x].push_back(Node(y,w));node[y].push_back(Node(x,w));}dfs(1,0,0);while(m--){int x,y;scanf("%d%d",&x,&y);int lca=LCA(x,y);printf("%d\n",sum[x]-sum[lca]+sum[y]-sum[lca]);}}return 0;
}

HDU - 2586 How far away ?(LCA)相关推荐

  1. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  2. HDU 2586 How far away ?【LCA】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意: 无向图,给定边及边权重,任意两点之间都有一条唯一的道路,道路上每个点只能出现一次.给定 ...

  3. hdu 2586 How far away ?(LCA模板)(倍增法)

    在dfs的过程中维护三个数组:  deep[i],表示i点在树中的深度:  grand[x][i],表示x的第2^i个祖先的节点编号:  dis[x][i],表示x到它2^i祖 #include< ...

  4. hdu - 2586 How far away ?(最短路共同祖先问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 最近公共祖先问题~~LAC离散算法 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起 ...

  5. hdu 2586 How far away ?

    最近公共祖先问题~~ 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起来,接下了有m次询问,每次询问两个房子a,b之间的距离是多少. 很明显的最近公共祖先问题,先建一棵树,然后求出每一点i ...

  6. hdu 2586 How far away? (LCA模板)

    题意: N个点,形成一棵树,边有长度. M个询问,每个询问(a,b),询问a和b的距离 思路: 模板题,看代码.DFS预处理算出每个结点离根结点的距离. 注意: qhead[maxn],而不是qhea ...

  7. HDU - 2586 How far away ?(离线Tarjan算法)

    1.给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离. 2.这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了. 这里的计算方法是,记下根结点到任意一 ...

  8. hdu 2005 第几天?(c语言)

    hdu 2005 第几天? link 题目描述 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...

  9. 什么LCA生命周期评价?LCA生命周期评价主要应用于哪些方面?

    生命周期分析(LifeCycleAssessment:LCA认证)是评价一种产品或一类设施从"摇篮到坟墓"全过程总体环境影响的手段,从区域.国家乃至全球的广度及其可持续发展的高度来 ...

最新文章

  1. Grails下 Membership和全文搜索实战录
  2. tensorflow使用tf.placeholder会报错
  3. linux编程能否用于windows,使R包在Windows和Linux中都可以工作
  4. springMVC实体用注解管理,多对多 set集合元素排序问题 解决
  5. Java:选择排序法
  6. css带占位符的搜索框,superplaceholder.js-功能强大的超级输入框占位符插件
  7. flask第七篇——URL与视图函数的映射
  8. android4.0 底部菜单,Android自定义控件系列(四)—底部菜单(下)
  9. 如何安装Windows 8系统中的telnet组件
  10. 为什么Zappos花钱让新员工走人?
  11. 索尼工厂被迫停止生产,日本地震带来的冲击可能不止于此
  12. 省赛第七场(fzu1881 ~fzu1889)
  13. CoreSeek详细入门教程
  14. xp框架下载官方_定制Xposed框架(干货)
  15. JAVA事务@Transactional之propagation
  16. Speex manul中文版
  17. [转]多CLIENT的SCC4设置
  18. 大连IT产业解析(1布局篇)
  19. 开发板连续显示图片 | BAD APPLE 万耦中的二次元世界
  20. 很酸-2021年全球程序员收入报告出炉

热门文章

  1. springboot项目中日志分类
  2. RabbitMQ Topic交换机(生产者)
  3. Apollo配置中心原理简介
  4. Curator实现分布式锁的基本原理-InterProcessMutex.internalLock
  5. ConcurrentHashMap的源码分析-put方法第二阶段
  6. 包含用法 includeFilters
  7. 方法级权限控制-@Secured注解使用
  8. 异常规范之异常的概念
  9. java课后习题_【整理】java私塾教程课后习题
  10. 用python画一个人_用turtle画个单身狗送给自己~