博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Greedy Pirate Gym - 101810M (lca)
阅读量:4701 次
发布时间:2019-06-09

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

对于题意 如果想要获取的硬币数最多,也就是所走的路径和最大,再想一下就是除了t到s这条路外其他的路都是一定能做一遍的(ps 题目给的是一棵树)。

题目就可以理解为 给定2个点求之间的路径;

所有边长减去这两点路径就是答案;

维护一个根节点到其他点的路径长度 d

维护一个其他节点到根节点路径长度 d1;

给定s t;

所以 d1[s]+d[t]-d[lca(s,t)]-d1[lca(s,t)])即为2点之间的路径长度,

#include
#include
#include
#include
#include
#include
#define ll long long#define mem(a,b) memset(a,b,sizeof(a))#define sc(x) scanf("%d",&(x))#define inf 0x3f3f3f3fusing namespace std;const int maxn=1e5+10;struct edge{ int u,v,w,w1,next;}e[maxn*2];int g[maxn*2],tot=0,d[maxn],d1[maxn];int n,dep[maxn];void make(int u,int v,int w,int w1){ e[++tot]=(edge){u,v,w,w1,g[u]}; g[u]=tot;}int fa[maxn],fathers[maxn][33];void deep(int u,int v,int de,int dd,int td){ fa[u]=v; fathers[u][0]=v; dep[u]=de; for(int i=g[u];i>0;i=e[i].next){ if(e[i].v==v) continue; d1[e[i].v]=dd+e[i].w; d[e[i].v]=td+e[i].w1; deep(e[i].v,u,de+1,dd+e[i].w,td+e[i].w1); }}void ben(){ int d=log(n)/log(2)+1; for(int k=1;k<=d;k++) for(int i=1;i<=n;i++) { fathers[i][k]=fathers[fathers[i][k-1]][k-1]; }}int lca(int u,int v){ int maxn=log(n)/log(2)+1; if(dep[u]
>i)&1) u=fathers[u][i]; if(u==v) return u; for(int i=maxn;i>=0;i--) { if(fathers[u][i]!=fathers[v][i]){ u=fathers[u][i]; v=fathers[v][i]; } } return fathers[u][0];}int main(){ int t,m; sc(t); while(t--) { tot=0; mem(g,0); sc(n); int ans=0; for(int i=1;i

 

转载于:https://www.cnblogs.com/minun/p/11270438.html

你可能感兴趣的文章
PHP......会话控制SESSION与COOKIE
查看>>
[转]AchartEngineActivity引擎绘制柱状图、曲线图
查看>>
[转]javascript实现限制上传文件的大小
查看>>
2-SAT问题的算法
查看>>
2012年,将是HTML5决胜的一年
查看>>
DOM的事件操作
查看>>
利用powerdesigner创建数据库
查看>>
js 中数组的遍历
查看>>
【.NET】使用HtmlAgilityPack抓取网页数据
查看>>
工厂方法模式
查看>>
许愿墙的搭建基于mysql
查看>>
信息技术
查看>>
SQL中的内连接 外连接 左连接 右连接 全连接
查看>>
GitLab问题小结
查看>>
iOS-常用的辅助工具软件
查看>>
一道数学题
查看>>
虚函数 多层继承有重写 (3)
查看>>
[转]为什么大型网站前端使用 PHP 后台逻辑用 Java?
查看>>
php数组根据值获取键名
查看>>
[Swift]GZip字符串压缩和解压缩(Java/C#通用)
查看>>