Tarjan求LCA胡乱写的板子 x
首先Tarjan算法的基本思路:
1.任选一个点为根节点,从根节点开始。
2.遍历该点u所有子节点v,并标记这些子节点v已被访问过。
3.若是v还有子节点,继续搜索下去,否则下一步。
4.合并v到u上。
5.寻找与当前点u有询问关系的点v。
6.若是v已经被访问过了,则可以确认u和v的最近公共祖先为v被合并到的父亲节点a。
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- const int N = ;
- const int M = ;
- int top,dad[N];
- bool used[N];
- struct heads {
- int head;
- }v1[N],v2[N];
- struct Edge {
- int v,next;
- }e1[M],e2[M];
- void chu()
- {
- memset(v1,-,sizeof(v1));
- memset(v2,-,sizeof(v2));
- memset(dad,-,sizeof(dad));
- memset(used,,sizeof(used));
- }
- int getdad(int x)
- {return dad[x] == - ? x : dad[x] = getdad(dad[x]);}
- void Unions(int a,int b)
- {
- int r1=getdad(a);
- int r2=getdad(b);
- if(r1!=r2)
- dad[r2]=r1;
- }
- void add1(int u,int v)
- {
- e1[top].v=v;
- e1[top].next=v1[u].head;
- v1[u].head=top++;
- }
- void add2(int u,int v)
- {
- e2[top].v=v;
- e2[top].next=v2[u].head;
- v2[u].head=top++;
- }
- void Tarjan(int u)
- {
- used[u]=true;
- for(int i=v2[u].head;i!=-;i=e2[i].next)
- {
- int v=e2[i].v;
- if(used[v])///无序输出
- printf("The LCA of (%d,%d) is -> %d\n",u,v,getdad(v));
- }
- for(int i=v1[u].head;i!=-;i=e1[i].next)
- {
- int v=e1[i].v;
- if(used[v])
- continue;
- Tarjan(v);
- Unions(u,v);
- }
- }
- int main()
- {
- int n,m,u,v;///n个点,m条边,uv进行连接
- int q;///q次询问
- scanf("%d%d",&n,&m);
- chu();///初始化
- while(m--)
- {
- scanf("%d%d",&u,&v);
- add1(u,v),add1(v,u);
- }
- scanf("%d",&q);
- top=;
- while(q--)
- {
- scanf("%d%d",&u,&v);
- add2(u,v),add2(v,u);
- }
- Tarjan();
- return ;
- }
Tarjan求LCA胡乱写的板子 x的更多相关文章
- 倍增\ tarjan求lca
对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点). dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v ...
- tarjan求lca的神奇
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 【Tarjan】洛谷P3379 Tarjan求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- Tarjan求LCA
LCA问题算是一类比较经典的树上的问题 做法比较多样 比如说暴力啊,倍增啊等等 今天在这里给大家讲一下tarjan算法! tarjan求LCA是一种稳定高速的算法 时间复杂度能做到预处理O(n + m ...
- 详解使用 Tarjan 求 LCA 问题(图解)
LCA问题有多种求法,例如倍增,Tarjan. 本篇博文讲解如何使用Tarjan求LCA. 如果你还不知道什么是LCA,没关系,本文会详细解释. 在本文中,因为我懒为方便理解,使用二叉树进行示范. L ...
- 倍增 Tarjan 求LCA
...
- SPOJ 3978 Distance Query(tarjan求LCA)
The traffic network in a country consists of N cities (labeled with integers from 1 to N) and N-1 ro ...
- Tarjan求LCA(离线)
基本思想 把要求的点对保存下来,在dfs时顺带求出来. 方法 将每个已经遍历的点指向它回溯的最高节点(遍历它的子树时指向自己),每遍历到一个点就处理它存在的询问如果另一个点已经遍历,则lca就是另一个 ...
- 用tarjan求LCA板子(比倍增快)
懒!!直接转载!!!! https://solstice23.top/archives/62
随机推荐
- linux 三剑客之sed常用总结
sed 列出5-7行 [root@www ~]# nl /etc/passwd | sed -n '5,7p' -n不在处理前打印,搜索root,/p打印 nl /etc/passwd | sed ' ...
- nigx下配置tp5.1路由
打开宝塔面板,找到你要配置路由的网站并找到配置文件(如图1) (图1) 2.在配置文件里添加一下代码 set $root = /www/wwwroot/www.blogs.test/public; # ...
- Mac OS 下定制终端颜色
方法 有五种方法, 参考网站,我使用的是 Oh My Zsh 方案一:(通过 .bash_profile 文件自定制) 方案二:(也是修改 ~/.bash_profile) 方案三:(三方插件 Oh ...
- python基础数据类型之一
python属于解释型(有良好的平台兼容性,在任何环境中都可以运行,修改代码的时候直接修改就可以,可以快速部署,不用停机维护).动态的(python在编程之前不需要提前设定好各种变量,C语言之类的需要 ...
- 今天发布MVC项目一直找不到页面
刚开始以为是framwork版本太高,服务器没安装. 后面想到应用池版本忘记选了
- 订单支付倒计时-剩余时间xx小时xx分xx秒
//<input type="hidden" id="endTime" value="1554912000000"> 结束时间 ...
- TIOBE 7月排行:Python 过分炒作,Perl 成受害者?
与上个月相比,Python 的指数又增加了不少,由 8.530% 上升到 9.260%. 我们还留意到,TIOBE 对这期榜单的标题描述是“Perl is one of the victims of ...
- Get To Know Linux: The /etc/init.d Directory
If you use Linux you most likely have heard of the init.d directory. But what exactly does this dire ...
- Linux SWAP交换分区维护
1.查看当前swap分区信息
- tornada-基础
回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有一个对 ...