博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FJUT 聪明的商人(树上倍增)题解
阅读量:6668 次
发布时间:2019-06-25

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

思路:求树上两点的距离,显然是dep[u] + dep[v] - 2 * dep[lca],用树上倍增去写。

参考:

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;const int maxn = 50000 + 10;const int seed = 131;const ll MOD = 1e9 + 7;const ll INF = 1e17;using namespace std;struct Edge{ int to, next;}edge[maxn << 2];int fa[maxn][100], dep[maxn], head[maxn], tot, maxf;void addEdge(int u, int v){ edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++;}void dfs(int x, int pre, int deep){ dep[x] = deep; fa[x][0] = pre; for(int i = 1; i <= maxf; i++){ if(fa[x][i - 1] != -1){ fa[x][i] = fa[fa[x][i - 1]][i - 1]; } else break; } for(int i = head[x]; i != -1; i = edge[i].next){ int v = edge[i].to; if(v != pre){ dfs(v, x, deep + 1); } }}int LCA(int u, int v){ if(dep[u] < dep[v]) swap(u, v); int dis = dep[u] - dep[v]; for(int i = 0; i <= maxf; i++){ if((1 << i) & dis) u = fa[u][i]; } if(u == v) return u; for(int i = maxf; i >= 0; i--){ if(fa[u][i] != fa[v][i]){ u = fa[u][i]; v = fa[v][i]; } } return fa[u][0];}void init(){ maxf = 30; memset(head, -1, sizeof(head)); memset(fa, -1, sizeof(fa)); tot = 0;}int main(){ int n, m, w; while(~scanf("%d%d%d", &n, &m, &w)){ init(); for(int i = 0; i < n - 1; i++){ int a, b; scanf("%d%d", &a, &b); addEdge(a, b); addEdge(b, a); } dfs(0, -1, 0); for(int i = 0; i < m; i++){ int p, q, v; scanf("%d%d%d", &p, &q, &v); int lca = LCA(p , q); int dis = dep[p] + dep[q] - 2 * dep[lca]; if(v - dis * w >= 0){ printf("%d\n", v - dis * w); } else{ printf("pass\n"); } } } return 0;}

 

转载于:https://www.cnblogs.com/KirinSB/p/9937648.html

你可能感兴趣的文章
HashRouter与BrowserRouter的异同
查看>>
EL表达式
查看>>
函数类型
查看>>
Break和Continue的用法
查看>>
CMD命令
查看>>
Angular练习题
查看>>
backbone 学习之history
查看>>
【转】Unity3D运行时刻资源管理
查看>>
【Java】数组升序和降序
查看>>
Implement Trie (Prefix Tree)
查看>>
【佛法】由佛法观爱情与人生——一位居士对爱情、婚姻和家庭的体悟
查看>>
Recover Binary Search Tree
查看>>
随机输出10个0到9的不重复的自然数
查看>>
ASP.NET Core HTTP 管道中的那些事儿
查看>>
加速数组操作(Array)
查看>>
收集计算机分区信息,去除列中的重复值(Excel)(空行)
查看>>
Python抓取zabbix性能监控图
查看>>
JDBC进行数据库的--增--删--改--案例----纯代码
查看>>
纪录一个table元素里面的tr th td
查看>>
sql查询语句心得
查看>>