https://vjudge.net/problem/POJ-1330

是到水的题,简单点在于其只需求一对lca即可,这是比较简单的。

主要看了以下blog

http://blog.csdn.net/hnust_xiehonghao/article/details/9109295

要点在于

1.用并查集维护。

2.必须是离线的,在线不行。

3.存边可以用vector,比较方便,毕竟边不多。

*4.rank可以实现启发式并查集,可以优化一些时间。

5.anse数组是存祖先的,因为并查集维护,所以只需一步更新即可。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<string>
 6 #include<cstring>
 7 #include<vector>
 8 const int size=10007;
 9
10 int n,f[size],anse[size],in[size],rank[size],vis[size];
11 using namespace std;
12 vector<int> node[size],que[size];
13 void init();
14 int find(int num);
15 void conbine(int aa,int bb);
16 void lca(int root)
17 {
18     int i,sz;
19     anse[root]=root;
20     sz=node[root].size();
21     for (int i=0;i<sz;i++)
22     {
23     //    if (fa!=node[root][i])
24     //    {25             lca(node[root][i]);
26             conbine(root,node[root][i]);
27             anse[find(node[root][i])]=root;
28     //    }
29     }
30     vis[root]=1;
31     sz=que[root].size();
32     for (int i=0;i<sz;i++)
33     {
34         if (vis[que[root][i]])
35         {
36             printf("%d\n",anse[find(que[root][i])]);
37             return;
38         }
39     }
40 }
41 int main()
42 {
43     int cas,i;
44     scanf("%d",&cas);
45     while (cas--)
46     {
47         int x,y;
48         scanf("%d",&n);
49         init();
50         for (int i=1;i<=n-1;i++)
51         {
52             scanf("%d%d",&x,&y);
53             node[x].push_back(y);
54             in[y]++;
55         }
56         scanf("%d%d",&x,&y);
57         que[x].push_back(y);
58         que[y].push_back(x);
59         for (y=1;y<=n;y++)
60         {
61             if (in[y]==0) break;
62         }
63         lca(y);
64     }
65 }
66 void init()
67 {
68     int i;
69     for (int i=1;i<=n;i++)
70     {
71         node[i].clear();
72         que[i].clear();
73         f[i]=i;
74         rank[i]=1;
75     }
76     memset(vis,0,sizeof(vis));
77     memset(in,0,sizeof(in));
78     memset(anse,0,sizeof(anse));
79 }
80 int find(int num)
81 {
82     if (f[num]!=num) f[num]=find(f[num]);
83     return f[num];
84 }
85 void conbine(int aa,int bb)
86 {
87     int x=find(aa),y=find(bb);
88     if (x==y) return;
89     if (rank[x]<=rank[y])
90     {
91         f[x]=y;
92         rank[y]+=rank[x];
93     }
94     else
95     {
96         f[y]=x;
97         rank[x]+=rank[y];
98     }
99 }

求在线算法要用倍增lca

转载于:https://www.cnblogs.com/fengzhiyuan/p/6775445.html

Tarjan求lca相关推荐

  1. 洛谷 - P3379 【模板】最近公共祖先(LCA)(RMQ求LCA/Tarjan求LCA)

    题目链接:点击查看 题目大意:给出一棵 n 个点组成的有根树,再给出 m 次询问,每次询问需要回答点 x 和点 y 的 lca 题目分析:今天新学了两种蛮有意思的求 LCA 的方法,总结一下四种方法各 ...

  2. 图论--tarjan求lca

    这是一种离线算法,但是时间超级快,是O(n+m). 主要是dfs实现这个过程. 下面详细介绍一下Tarjan算法的基本思路: 1.任选一个点为根节点,从根节点开始. 2.遍历该点u所有子节点v,并标记 ...

  3. tarjan求LCA模板

    废话不多说,模板拿来. 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # ...

  4. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  5. 牛客 - 牛半仙的妹子Tree(按询问分块+RMQ求LCA)

    题目链接:点击查看 题目大意:给出一棵有 n 个节点的树,需要执行 m 次操作: 1 x:点 x 被染色,且随后每一秒染色的区域都会向外扩展一个单位 2 x:清空所有的染色 3 x:问点 x 是否被染 ...

  6. 【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

    题干: 网络管理员管理大型网络.该网络由N台计算机和成对计算机之间的M链路组成.任何一对计算机都通过连续的链接直接或间接连接,因此可以在任何两台计算机之间转换数据.管理员发现某些链接对网络至关重要,因 ...

  7. 树上倍增求LCA及例题

    先瞎扯几句 树上倍增的经典应用是求两个节点的LCA 当然它的作用不仅限于求LCA,还可以维护节点的很多信息 求LCA的方法除了倍增之外,还有树链剖分.离线tarjan ,这两种日后再讲(众人:其实是你 ...

  8. 求 LCA 的三种方法

    (YYL: LCA 有三种求法, 你们都知道么?) (众神犇: 这哪里来的傻叉...) 1. 树上倍增 对于求 LCA, 最朴素的方法是"让两个点一起往上爬, 直到相遇", &qu ...

  9. 《信息学奥赛一本通 提高篇》 第四部分 数据结构 第4章 倍增求LCA

    例题1 点的距离 信息学奥赛一本通(C++版)在线评测系统 例题2 暗的连锁(Poj3417) 信息学奥赛一本通(C++版)在线评测系统 LOj10131 暗的连锁_juruo_xlh-CSDN博客 ...

最新文章

  1. SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )
  2. 海量数据处理——位图法bitmap
  3. Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
  4. java实现语法分析器_语法分析 | 语法分析的任务
  5. 让VC编译的Release版本程序在其他机器上顺利运行
  6. windows应用程序的开发一个键盘记录器
  7. ASP.NET使用管道模型(PipleLines)处理HTTP请求
  8. git .gitignore 忽略的文件还会被提交
  9. 随手记_重建的五花八门的点云地图效果(供娱乐)
  10. php无法加载ssh扩展,php的ssh2扩展正常安装,却无法连接目标主机
  11. ASP.NET MVC 5高级编程 (pdf书)
  12. ES RestClient查询文档
  13. python实现电脑自动开机_python自动循环定时开关机(非重启)测试
  14. Xpose 建立新工程
  15. 离散分配方式——基本页式存储管理方式
  16. android 重复文件夹,清理手机空间小工具!搜索重复文件App
  17. caffe 损失函数
  18. linux控制cpu占用率
  19. 研究中学习【方法】 | Heckman二值选择模型
  20. 调试串口导致烧录失败

热门文章

  1. ubuntu20.04LTS系统的终端terminal透明化设置
  2. java byte 判断相等_深入理解Java装箱与拆箱
  3. 使用睡袋_睡袋能用几十年?!只要你照着做(一)
  4. android工程引入unity,Unity导出Android Studio工程
  5. echarts做企业关系图谱_echarts 关系图
  6. python所有算法_Python实现的各种常见分布算法示例
  7. 用C语言写HMI程序,HMI画面元素组成设计及代码生成方法与流程
  8. c++图形中如何判断鼠标点击在一条直线上_中考数学常考题型精讲精练系列:函数图象上点的存在性问题中的距离与面积...
  9. el table 固定表头和首行_el-table表头根据内容自适应,解决表头错位和固定列错位(完美解决)...
  10. 动画 | 空调是怎么制冷的?