How far away

&题解:

和上篇是一样的题,这用的是lca方法做的, 不知道为什么,把数组开到80000 就a了 >_<

哈 我现在知道为什么了,因为我的rmq数组没有乘2,rmq比较的是depth数组,但是depth数组的范围是maxn*2,所以rmq的数组乘2就好了

&代码:

  1. #include <cstdio>
  2. #include <bitset>
  3. #include <iostream>
  4. #include <set>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <algorithm>
  8. #include <map>
  9. #include <queue>
  10. #include <vector>
  11. using namespace std;
  12. #define INF 0x3f3f3f3f
  13. #define ll long long
  14. #define fo(i,a,b) for(int i=(a);i<=(b);i++)
  15. #define fd(i,a,b) for(int i=(a);i>=(b);i--)
  16. const int max_v = 40000 + 7;
  17. int rq[max_v*2][20], mm[max_v*2], n, m;
  18. void initRMQ(int n, int b[]) {
  19. mm[0] = -1;
  20. for(int i = 1; i <= n; i++) {
  21. mm[i] = (i & (i - 1)) ? mm[i - 1] : mm[i - 1] + 1;
  22. rq[i][0] = i;
  23. }
  24. for(int j = 1; j <= mm[n]; j++)
  25. for(int i = 1; i + (1 << j) - 1 <= n; i++) {
  26. int x = rq[i][j - 1], y = rq[i + (1 << (j - 1))][j - 1];
  27. rq[i][j] = b[x] < b[y] ? x : y;
  28. }
  29. }
  30. int RMQ(int x, int y, int b[]) {
  31. if(x > y) swap(x, y);
  32. int k = mm[y - x + 1];
  33. int x2 = rq[x][k], y2 = rq[y - (1 << k) + 1][k];
  34. return b[x2] < b[y2] ? x2 : y2;
  35. }
  36. int dis[max_v];
  37. struct Edge {
  38. int u, v, w, nx;
  39. } G[2 * max_v];
  40. int root;
  41. int vs[max_v * 2];
  42. int depth[max_v * 2];
  43. int id[max_v];
  44. int cnt, ft[max_v * 2], vis[max_v];
  45. void Add(int u, int v, int w) {
  46. G[cnt].u = u; G[cnt].v = v; G[cnt].w = w;
  47. G[cnt].nx = ft[u];
  48. ft[u] = cnt++;
  49. }
  50. void dfs(int v, int p, int d, int &k) {
  51. id[v] = k;
  52. vs[k] = v;
  53. depth[k++] = d;
  54. // vis[v] = 1;
  55. for(int i = ft[v]; ~i; i = G[i].nx) {
  56. // printf("%d %d-- %d\n", G[i].u, G[i].v, p);
  57. if(G[i].v != p) {
  58. dis[G[i].v] = dis[G[i].u] + G[i].w;
  59. dfs(G[i].v, G[i].u, d + 1, k);
  60. vs[k] = v;
  61. depth[k++] = d;
  62. }
  63. }
  64. }
  65. void initLCA() {
  66. int k = 1;
  67. memset(vis, 0, sizeof(vis));
  68. dfs(root, -1, 0, k);
  69. initRMQ(k - 1, depth);
  70. }
  71. int LCA(int u, int v) {
  72. return vs[RMQ(min(id[u], id[v]), max(id[u], id[v]) + 1, depth)];
  73. }
  74. int main() {
  75. //("E:1.in", "r", stdin);
  76. int T; scanf("%d", &T);
  77. while(T--) {
  78. scanf("%d%d", &n, &m);
  79. cnt = 0;
  80. memset(ft, -1, sizeof(ft));
  81. fo(i, 1, n - 1) {
  82. int x, y, val;
  83. scanf("%d%d%d", &x, &y, &val);
  84. Add(x, y, val);
  85. Add(y, x, val);
  86. }
  87. root = 1;
  88. dis[root] = 0;
  89. initLCA();
  90. fo(i, 1, m) {
  91. int u, v;
  92. scanf("%d%d", &u, &v);
  93. printf("%d\n", dis[u] + dis[v] - 2 * dis[LCA(u, v)]);
  94. }
  95. }
  96. return 0;
  97. }

这个是用临街矩阵写的,RT了,但有注释

  1. #include <cstdio>
  2. #include <bitset>
  3. #include <iostream>
  4. #include <set>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <algorithm>
  8. #include <map>
  9. #include <queue>
  10. #include <vector>
  11. using namespace std;
  12. #define INF 0x3f3f3f3f
  13. #define ll long long
  14. #define fo(i,a,b) for(int i=(a);i<=(b);i++)
  15. #define fd(i,a,b) for(int i=(a);i>=(b);i--)
  16. #define pii pair<int,int>
  17. //RMQ 相关
  18. const int maxn = 40000 + 7, max_v = maxn;
  19. int dp[maxn][20], mm[maxn], n, m;
  20. void initRMQ(int n, int b[]) {
  21. mm[0] = -1;
  22. for(int i = 1; i <= n; i++) {
  23. mm[i] = (i & (i - 1)) ? mm[i - 1] : mm[i - 1] + 1;
  24. dp[i][0] = i;
  25. }
  26. for(int j = 1; j <= mm[n]; j++)
  27. for(int i = 1; i + (1 << j) - 1 <= n; i++) {
  28. int x = dp[i][j - 1], y = dp[i + (1 << (j - 1))][j - 1];
  29. dp[i][j] = b[x] < b[y] ? x : y;
  30. // dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
  31. }
  32. }
  33. int RMQ(int x, int y, int b[]) {
  34. if(x > y) swap(x, y);
  35. int k = mm[y - x + 1];
  36. int x2 = dp[x][k], y2 = dp[y - (1 << k) + 1][k];
  37. return b[x2] < b[y2] ? x2 : y2;
  38. }
  39. int dis[maxn];
  40. //LCA 相关
  41. vector<pii> G[max_v]; //图的邻接表
  42. int root;
  43. int vs[max_v * 2]; //dfs访问的顺序
  44. int depth[max_v * 2]; //节点深度
  45. int id[max_v]; //各顶点在vs中首次出现的下标
  46. //v:现节点 p:父节点 d:深度 k:编号
  47. void dfs(int v, int p, int d, int &k) {
  48. id[v] = k;
  49. vs[k] = v;
  50. depth[k++] = d;
  51. for(int i = 0; i < G[v].size(); i++) {
  52. if(G[v][i].first != p) {
  53. dis[G[v][i].first] = dis[v] + G[v][i].second;
  54. dfs(G[v][i].first, v, d + 1, k);
  55. vs[k] = v;
  56. depth[k++] = d;
  57. }
  58. }
  59. }
  60. void initLCA(int V) {
  61. int k = 1;
  62. dfs(root, -1, 0, k);
  63. initRMQ(k - 1, depth);
  64. }
  65. int LCA(int u, int v) {
  66. return vs[RMQ(min(id[u], id[v]), max(id[u], id[v]) + 1, depth)];
  67. }
  68. int main() {
  69. //("E:1.in", "r", stdin);
  70. int T; scanf("%d", &T);
  71. while(T--) {
  72. scanf("%d%d", &n, &m);
  73. fo(i, 1, n) G[i].clear();
  74. fo(i, 1, n - 1) {
  75. int x, y, val;
  76. scanf("%d%d%d", &x, &y, &val);
  77. G[x].push_back(make_pair(y, val));
  78. G[y].push_back(make_pair(x, val));
  79. }
  80. root = 1;
  81. dis[root] = 0;
  82. initLCA(n);
  83. fo(i, 1, m) {
  84. int u, v;
  85. scanf("%d%d", &u, &v);
  86. printf("%d\n", dis[u] + dis[v] - 2 * dis[LCA(u, v)]);
  87. }
  88. // for(int i = 0; i < 8; i++) {
  89. // printf("%3d", i);
  90. // } printf("\n");
  91. // for(int i = 0; i < 8; i++) {
  92. // printf("%3d", dis[i]);
  93. // } printf("\n");
  94. }
  95. return 0;
  96. }

HDU 2586 How far away(LCA+邻接表)的更多相关文章

  1. HDU 2586 How far away(dfs+邻接表)

    How far away [题目链接]How far away [题目类型]dfs+邻接表 &题意: 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起来,接下了有m次询问,每次询问 ...

  2. hdu 2586(最近公共祖先LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 思路:在求解最近公共祖先的问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好 ...

  3. HDU 2586 How far away? LCA 转化成RMQ

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 [题意] 给出一个N 个和N-1条边的连通图,询问任意两点间的距离.N<=40000 . [分 ...

  4. HDU 2586 倍增法求lca

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. TTTTTTTTTTTTTTTTT HDU 2586 How far away LCA的离线算法 Tarjan

    链接: How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  6. 【HDU 2586 How far away?】LCA问题 Tarjan算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给出一棵n个节点的无根树,每条边有各自的权值.给出m个查询,对于每条查询返回节点u到v的最 ...

  7. HDU 2586 How far away ?【LCA】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 How far away ? Time Limit: 2000/1000 MS (Java/Oth ...

  8. LCA(最近公共祖先)--tarjan离线算法 hdu 2586

    HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  9. HDU 4858 项目管理(邻接表 暴力模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可 ...

随机推荐

  1. Spark 广播变量BroadCast

    一. 广播变量 广播变量允许程序员将一个只读的变量缓存在每台机器上,而不用在任务之间传递变量.广播变量可被用于有效地给每个节点一个大输入数据集的副本.Spark还尝试使用高效地广播算法来分发变量,进而 ...

  2. windows下局域网文件共享,不需要登录账号密码

    基于局域网中,有时候需要传输一个大的文件都需要用到U盘,很麻烦,所以优选文件共享.但是有时候会出现需要登录账户密码,所以需要设置第三步,步骤如下: 1.选中要共享的文件夹,右键有一个共享选项,点击出现 ...

  3. JAVA并发编程——守护线程(Daemon Thread)

    在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称 ...

  4. Java中Comparable和Comparator区别

    很好的一篇博客:http://blog.csdn.net/jq_ak47/article/details/61203817 http://www.cnblogs.com/cmxwt/p/6215253 ...

  5. websocket采用tomcat方式,IOC类对象无法注入的解决方案

    前言 我采用的spring框架做的,主要用于IOC AOP ,spring之前采用的2.0版本.(2.0版本出错!下面有解释): 要实现websocket 实现后台主动与JSP发送数据. 具体操作 在 ...

  6. BarTender安装常见问题集结

    很多人在安装BarTender时,会出现各种安装程序信息警告提示,导致软件无法继续安装下去,那么针对这些Bartender安装问题我们要怎么正确解决呢?下面,小编将BarTender安装失败常见问题, ...

  7. adb命令集锦

    adb 是什么? adb工具即Android Debug Bridge(安卓调试桥) tools.它就是一个命令行窗口,用于电脑端与模拟器或者真实设备交互. 常用操作: 把文件发送到android设备 ...

  8. linux下GPRS模块使用AT命令实现拨接电话,发中英文短信

    开发板           :fl2440 cpu                :  s3c2440(arm9) 开发模块       :A7(GPRS/GPS) 远程登陆软件:PUTTY **** ...

  9. ubuntu14.04 terminator字体挤在一起问题

    字体挤在一起:在ubuntu下请选择mono后缀的字体就可以了 右键—>首选项—>profile—>general—>字体设置成ubuntu mono 或Free mono

  10. 浅析 <路印协议--Loopring> 及整体分析 Relay 源码

    作者:林冠宏 / 指尖下的幽灵 前序: 路印协议功能非常之多及强大,本文只做入门级别的分析. 理论部分请细看其白皮书,https://github.com/Loopring/whitepaper 实际 ...