博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDU 2586】LCA模板
阅读量:7092 次
发布时间:2019-06-28

本文共 2060 字,大约阅读时间需要 6 分钟。

在一棵树上 求2个点的最短距离。那么首先利用LCA找到2个点的近期公共祖先

公式:ans = dis(x) + dis(y) - 2 * dis(lca(x,y))

这里的dis(x)指的上x距离根节点的距离

注意一些细节方面,比方数组的越界问题:

#include
#include
#include
#include
using namespace std;typedef long long LL;const int maxn = 45555;struct Edge{ int to; LL dist; Edge(int to,LL dist):to(to),dist(dist){};};int n,m;int deep[maxn],pa[maxn][22];LL dis[maxn];vector
G[maxn];void init(){ memset(pa,-1,sizeof(pa)); for(int i = 1; i <= n; i++) G[i].clear();}//----------------LAC---------------------------void dfs(int pos,int d,LL dist){ //printf("[%d %d]\n",pos,dist); deep[pos] = d; dis[pos] = dist; int Size = G[pos].size(); for(int i = 0; i < Size; i++) dfs(G[pos][i].to,d + 1,dist + G[pos][i].dist);}void lca_init(){ for(int j = 1; (1 << j) <= n; j++) for(int i = 1; i <= n; i++) if(pa[i][j - 1] != -1) pa[i][j] = pa[pa[i][j - 1]][j - 1];}int lca(int a,int b){ if(a == b) return a; if(deep[a] < deep[b]) swap(a,b); int i; for(i = 0;(1 << i) <= deep[a]; i++); for(int j = i; j >= 0; j--) if(pa[a][j] != -1 && deep[pa[a][j]] >= deep[b]) a = pa[a][j]; if(a == b) return b; for(int j = i; j >= 0; j--) if(pa[a][j] != -1 && deep[pa[a][j]] != deep[pa[b][j]]){ a = pa[a][j]; b = pa[b][j]; } return pa[a][0];}//-------------------------------------------------int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); int x,y,z; init(); for(int i = 0; i < n - 1; i++){ scanf("%d%d%d",&x,&y,&z); G[x].push_back(Edge(y,z)); pa[y][0] = x; } for(int i = 1; i <= n; i++)if(pa[i][0] == -1){ dfs(i,0,0); break; } lca_init(); for(int i = 0; i < m; i++){ scanf("%d%d",&x,&y); LL ans = dis[x] + dis[y] - 2 * dis[lca(x,y)]; printf("%I64d\n",ans); } } return 0;}

转载地址:http://jmnql.baihongyu.com/

你可能感兴趣的文章
JSP放入Jar包支持
查看>>
Mysql日期和时间函数总结
查看>>
Servlet容器启动过程
查看>>
CentOS安装配置nagios(1)
查看>>
RedHat 6.4 搭建rhcs集群
查看>>
我的友情链接
查看>>
Exchange Server 2010的俩种版本比较
查看>>
asp.net 插入视频
查看>>
11、网络--Linux Bridge(网桥基础)
查看>>
参观迅达云成观后感
查看>>
linux(ubuntu)查看硬件设备命令
查看>>
一八年第三天晚上十点半的thinking
查看>>
keepalived 组播的配置
查看>>
《深入PHP:面向对象、模式与实践》(一)
查看>>
工控系统安全问题汇总(一)
查看>>
yii2.0-rules验证规则应用实例
查看>>
读书笔记:参数传递的那些事
查看>>
11个实用的CSS学习工具[转载收藏]
查看>>
key寻址算法
查看>>
编译原理first集和follow集的求法
查看>>