hdu 2586 How far away ?(LCA转RMQ~)
来源:互联网 发布:windows nginx php 编辑:程序博客网 时间:2024/06/05 09:24
学了两天终于会了在线和离线这两种算法。。。。唉
以下就是我的模板啦,我看到大佬们有些是用前向星加边的,我暑假学了好久都没学懂,,遂放弃,老老实实用vector。。。
#include <math.h>#include <stdio.h>#include <string.h>#include <iostream>#include <vector>using namespace std;const int MAXN = 40005;struct node { int v, w; node(int v_, int w_) { v = v_; w = w_; }};vector<node> edge[MAXN];int dp[MAXN << 1] [30]; // dp[i][j]存储deep数组中下标i开始长度为2^j的子串中最小值的下标int first[MAXN], ver[MAXN << 1], deep[MAXN << 1];int dis[MAXN], ip, indx;void dfs(int u, int fa, int dep) { first[u] = ++indx; deep[indx] = dep; ver[indx] = u; for (int i = 0; i < (int)edge[u].size(); i++) { int v = edge[u][i].v; int w = edge[u][i].w; if (v == fa) continue; dis[v] = dis[u] + w; dfs(v, u, dep + 1); deep[++indx] = dep; ver[indx] = u; }}void ST(int n) { for (int i = 1; i <= n; i++) dp[i][0] = i; for (int j = 1; (1 << j) <= n; j++) { for (int i = 1; i + (1 << j) <= n; i++) { int x = dp[i][j - 1]; int y = dp[i + (1 << j)][j - 1]; dp[i][j] = deep[x] < deep[y] ? x : y; } }}int RMQ(int l, int r) { int k = (int)log((double)(r - l + 1) / log(2.0)); int a = dp[l][k], b = dp[r - k + 1][k]; return deep[a] < deep[b] ? a : b;}int LCA(int l, int r) { int x = first[l], y = first[r]; if (x > y) swap(x, y); return ver[RMQ(x, y)];}int main(void) { int t, n, m, x, y, z; scanf("%d", &t); while (t--) { memset(dis, 0, sizeof(dis)); scanf("%d%d", &n, &m); for (int i = 1; i < n; i++) { scanf("%d%d%d", &x, &y, &z); edge[x].push_back((node){y, z}); edge[y].push_back((node){x, z}); } indx = 0; dis[1] = 0; dfs(1, -1, 0); ST(2 * n - 1); while (m--) { int x, y; scanf("%d%d", &x, &y); int t = LCA(x, y); printf("%d\n", dis[x] + dis[y] - 2 * dis[t]); } } return 0;}
阅读全文
0 0
- hdu 2586 How far away ?(LCA转RMQ~)
- hdu 2586 How far away ?【rmq+lca】
- hdu 2586 How far away ? (LCA转RMQ)
- hdu 2586 How far away LCA在线RMQ(模板题)
- HDU 2586 - How far away ? (LCA)
- hdu 2586 How far away ?(LCA)
- HDU 2586 How far away ?(LCA)
- hdu 2586 How far away ?(LCA)
- How far away ? (hdu 2586 LCA)
- hdu 2586 How far away ?(LCA)
- HDU 2586 How far away ?(LCA)
- HDU 2586How far away ?(LCA)
- hdu-2586 How far away ?(LCA)
- HDU 2586 How far away ?(LCA)
- HDU 2586 How far away ?(lca)
- LCA和RMQ练习,水题(LCA模板题):【hdu 2586】 How far away ?
- hdu2586 How far away ?(LCA->RMQ)
- hdoj 2586 How far away ? 【LCA转RMQ入门题】
- asp.net 连接sql server 插入
- Linux 里的 (#暗物质*) session 跨域问题
- Warning:android-apt plugin is incompatible with future version of Android Gradle plugin. Please use
- Android,安卓,toolbar,menu显示位置,及样式调整,及使用PopupWindow 实现menu下拉菜单gong
- 程序猿生涯第一步
- hdu 2586 How far away ?(LCA转RMQ~)
- 最能激发员工的不是薪水,而是成就感
- 指针的再探究
- Linux编程——终止线程的正常方式及取消点
- jsp&el&jstl
- 在一个旋转有序数组中,查找最小的数
- 2、HTML基本语法
- 微信发送客服接口
- 开发小总结