poj 1330 Nearest Common Ancestors LCA/DFS

题目链接:

http://poj.org/problem?id=1330

题意:

求出两点间的最近公共祖先。

题解:

第一种:
并查集维护:http://www.cnblogs.com/procedure2012/archive/2012/01/29/2331468.html
利用并查集在每次对子树进行遍历时进行合并,因为对以x为根的子树的遍历时只有当x的所有子树都遍历过后才会把它合并到他父亲的集合里,所以当需要查找的两个节点q1、q2中q1已被遍历且q2正是当前遍历的节点时说明此时只有距他们最近的祖先是在集合里的(可能为q1或q2),所以只要找到已被遍历的q1所在集合的祖先就是这两的节点的LCA。
这里写图片描述

第二种
直接dfs:每次从u和v的depth较深的开始往上面找,然后如果一样就跳出,不一样继续找

代码:

并查集

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 using namespace std;
 7 typedef long long ll;
 8 #define MS(a) memset(a,0,sizeof(a))
 9 #define MP make_pair
10 #define PB push_back
11 const int INF = 0x3f3f3f3f;
12 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
13 inline ll read(){
14     ll x=0,f=1;char ch=getchar();
15     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
16     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
17     return x*f;
18 }
19 //
20 const int maxn = 1e4+10;
21 
22 vector<int> g[maxn];
23 int f[maxn],vis[maxn],fa[maxn];
24 int q1,q2;
25 int a[maxn];
26 
27 int find(int x){
28     return fa[x]==x ? x : fa[x]=find(fa[x]);
29 }
30 
31 void Union(int x,int y){
32     int p1=find(x),p2=find(y);
33     if(p1 == p2) return ;
34     fa[p1] = p2;
35 }
36 
37 void dfs(int u){
38     for(int i=0; i<(int)g[u].size(); i++){
39         int v = g[u][i];
40         dfs(v);
41         Union(u,v); // 合并的时候是u合并到v上,u的父亲是v,利于下面寻找祖先,也就是所有u的父亲的祖先都是u
42         a[find(u)] = u; // u的所有孩子的祖先都是u
43     }
44     vis[u] = 1;
45     if(q1==u && vis[q2]) printf("%d\n",a[find(q2)]);
46     if(q2==u && vis[q1]) printf("%d\n",a[find(q1)]);
47     return ;
48 }
49 
50 int main(){
51     int T = read();
52     while(T--){
53         int n = read();
54         for(int i=0; i<=n; i++) {
55             g[i].clear();
56             f[i] = 0;
57             fa[i] = i;
58             vis[i] = 0;
59             a[i] = 0;
60         }
61         int u,v;
62         for(int i=1; i<n; i++){
63             scanf("%d%d",&u,&v);
64             f[v] = 1;
65             g[u].push_back(v);
66         }
67         cin >> q1 >> q2;
68         int i;
69         for(i=1; i<=n; i++)
70             if(f[i]==0) break;
71         dfs(i);
72     }
73 
74     return 0;
75 }

 

直接找:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 using namespace std;
 7 typedef long long ll;
 8 #define MS(a) memset(a,0,sizeof(a))
 9 #define MP make_pair
10 #define PB push_back
11 const int INF = 0x3f3f3f3f;
12 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
13 inline ll read(){
14     ll x=0,f=1;char ch=getchar();
15     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
16     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
17     return x*f;
18 }
19 //
20 const int maxn = 1e4+10;
21 
22 vector<int> g[maxn];
23 int d[maxn],p[maxn],f[maxn];
24 
25 void dfs(int u,int fa,int de){
26     p[u] = fa;
27     d[u] = de;
28     for(int i=0; i<(int)g[u].size(); i++){
29         int v = g[u][i];
30         if(v == fa) continue;
31         dfs(v,u,de+1);
32     }
33 }
34 
35 int lca(int u,int v){
36     while(d[u] > d[v]) u = p[u];
37     while(d[v] > d[u]) v = p[v];
38     while(u != v){
39         u = p[u];
40         v = p[v];
41     }
42 
43     return u;
44 }
45 
46 int main(){
47     int T = read();
48     while(T--){
49         int n = read();
50         for(int i=0; i<=n; i++) {
51             g[i].clear();
52             f[i] = 0; d[i] = 0; p[i] = 0;
53         }
54         int u,v;
55         for(int i=1; i<n; i++){
56             scanf("%d%d",&u,&v);
57             f[v] = 1;
58             g[u].push_back(v);
59         }
60         int i;
61         for(i=1; i<=n; i++)
62             if(f[i]==0) break;
63         dfs(i,-1,0);
64         cin >> u >> v;
65         cout << lca(u,v) << endl;
66     }
67 
68     return 0;
69 }

 

转载于:https://www.cnblogs.com/yxg123123/p/6827562.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式的Java 8 Lambda表达式–装饰器设计模式

Decorator模式&#xff08;也称为Wrapper &#xff09;允许将行为静态或动态地添加到单个对象&#xff0c;而不会影响同一类中其他对象的行为。 可以将其视为子类的替代方法。 我们知道子类在编译时会增加行为&#xff0c;并且更改会影响原始类的所有实例。 另一方面&#xff0…

ie浏览器网页版进入_IE浏览器打开网页提示无法打开Internet站点的解决办法

IE浏览器打开网页时提示Internet explorer无法打开站点&#xff0c;这是什么问题&#xff1f;Internet explorer打不开网页提示无法打开站点怎么办&#xff1f;请看下文五种解决办法。方法一&#xff1a;管理加载项打开浏览器—工具—Internet选项这时会出现“Internet选项”对…

epic转移游戏_Epic游戏商城更改退款政策 和steam一模一样

游侠网关注我们&#xff0c;获得最快的游戏资讯Epic正在打造自己的数字游戏商城&#xff0c;一方面对开发者提供更慷慨的销售分成&#xff0c;另一方面对玩家提供每两个月更新一次的免费游戏。虽然Epic游戏商城中的作品数量还在起步阶段&#xff0c;也缺少一些关键的常用功能&a…

计算机组成原理实验三报告,计算机组成原理实验三报告

计算机组成原理实验三报告 实 验 报 告 三课 程 计算机组成原理 姓 名 学 号实验项目 存储器实验 同组姓名 学 号指导教师 专业班级 计算机科学与技术 09 实验时间 2011-6-6实验三 存储器实验一、实验目的1&#xff0e;掌握存储器的功能和构成。2&#xff0e;了解静态随机存储器…

防盗Java EE –保护您的Java EE企业应用程序

redev离我们仅有几天的路程&#xff0c;我受邀作了两次演讲。 其中之一是关于我最喜欢的主题&#xff1a;安全性和Java EE。 它旨在实现两个目标。 一方面向典型的Java EE开发人员介绍整个应用程序安全过程和主要目标。 而且还要查看有关Java EE在满足典型需求时必须提供的内容…

wsl nvidia驱动_WIN10安装NVIDIA面板两种方式

无应用商店安装NVIDIA面板进入NVIDIA官网下载标准版驱动https://www.nvidia.cn/Download/Find.aspx?langcn​www.nvidia.cn驱动类型选择标准下载的名称选择NVIDIA Studoio Driver SD这样下载出来的驱动就带有NVIDIA面板控制面有应用商店但是下载不动的可以使用下面的方式打开网…

Python之内置函数

Python内置函数 #1、语法 # eval(str,[,globasl[,locals]]) # exec(str,[,globasl[,locals]])#2、区别 #示例一&#xff1a; s123 print(eval(s)) #eval用来执行表达式&#xff0c;并返回表达式执行的结果 print(exec(s)) #exec用来执行语句&#xff0c;不会返回任何值6 None …

latex 无穷_《天龙3D》新资料片“骑乐无穷”即将上线

驭风逐战&#xff0c;骑乐无穷。11月12日金庸正版授权、全民第一武侠RPG手游《天龙3D》新资料片“骑乐无穷”即将上线!全新坐骑装备系统开启&#xff0c;升星养成坐骑装备;全新坐骑相关副本四绝夺魁&#xff0c;多人闯关PVP、PVE组队竞技;元旦主题月即将开启&#xff0c;趣味游…

广州大学计算机学院毕业设计,【广州大学】毕业设计(计算机科学与技术)专业要求...

广州大学成人高等教育毕业设计专业要求【专业名称】计算机科学与技术【适用范围】非学位论文【执笔者】谷岩【完成形式】个人独立【写作形式】毕业设计【写作要求】1&#xff0e;目标毕业设计是计算机科学与技术专业人才培养的重要环节。其主要目标是培养学生综合应用计算机科学…

实验二+140+阮晨曦

---恢复内容开始--- 一、实验目的 掌握覆盖测试的基本方法和实践 二、实验要求 运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例&#xff0c;并运行测试用例检查程序的正确与否&#xff0c;给出程序缺陷小结。 三、实验内容 &#xff08;1&#xff09;设计某程序的路径覆盖测…

hadoop重命名文件_Hadoop -- 3. 从Flume到HDFS

提起Flume, 就先讲一下它的基本作用, 它可以从不同的数据源导入到一个集中的地方存放起来,基本架构如下图所示*上图为Flume Data Flow Model, Ref: Flume 1.9.0 User Guide本篇文章会做一个小demo, 数据从spooling directory来(而不是官网图中画的Web Server), 先经过channel, …

电脑计算器_CPA考生注意!2020考场只允许带这种计算器

注册会计师每年采用闭卷、计算机化考试方式。根据往年考生的反应&#xff0c;计算器的使用在考场上发挥了非常大的作用。值得大家注意的是&#xff0c;并不是所有的计算器都能带进考场&#xff0c;考试对计算器有什么要求?如何挑选到正确的计算器&#xff1f;我们一起来看看&a…

最早的齿轮计算机,世界最古老“计算机”出土后110年,科学家终于解开它的秘密...

伦敦大学学院(UCL)的研究团队&#xff0c;提出了“一个激进的新模型&#xff0c;与所有数据相匹配&#xff0c;并最终优雅地展示出了古希腊人眼中的宇宙”。1901年&#xff0c;在希腊岛屿安提基特拉的海岸&#xff0c;潜水员偶然发现了一艘古代沉船。沉船中的一件文物&#xff…

通过Java 8中的Applicative Builder组合多个异步结果

几个月前&#xff0c;我发布了一个出版物 &#xff0c;在其中详细解释了我提出的名为Outcome的抽象&#xff0c;它通过强制使用语义帮助了我很多 没有副作用的代码。 通过遵循这种简单&#xff08;但功能强大&#xff09;的约定&#xff0c;我最终将任何类型的故障&#xff08;…

diskgenius 接触“只读“失败_相亲总是失败,这三个步骤你都做了吗?

原标题&#xff1a;相亲总是失败&#xff0c;这三个步骤你都做了吗&#xff1f;虽然现在爱情很稀缺&#xff0c;但想必大家都想找个男女朋友&#xff0c;想谈一场甜甜的恋爱。 而相亲&#xff0c;无疑是脱单最直接、最有效的方式&#xff0c;没有之一。但不管是经人介绍&#x…

agv系统介绍_重载AGV小车主要结构及导航原理是什么?

相信对AGV有过了解的朋友都知道&#xff0c;当我们在进行工业生产过程时&#xff0c;重载AGV小车可以帮我们实现无人驾驶搬运的一个工作&#xff0c;可以保证AGV在运行时不用通过人工干预的情况下来完成现场的搬运工作,通过无人驾驶技术进行自主导航将货物自动从起始位置搬运到…

怎样打开计算机音频服务器,win10系统音频服务器未运行的修复步骤

有关win10系统音频服务器未运行的操作方法想必大家有所耳闻。但是能够对win10系统音频服务器未运行进行实际操作的人却不多。其实解决win10系统音频服务器未运行的问题也不是难事&#xff0c;小编这里提示两点&#xff1a;1、在1、windows10“音频服务未运行”,有个红色小叉咋办…

rgb fusion检测不到显卡_【论文阅读27】Co-Fusion

主要内容物体级别的语义SLAM。维护一个背景模型和多物体模型&#xff0c;每个模型由面元地图表示。基于运动分割和语义信息检测运动物体。使用基于ICP对齐的几何误差和基于颜色差异的光度误差跟踪背景模型&#xff08;相机位姿&#xff09;和多个运动物体。根据[8]的方法更新每…

u盘插在电脑上灯亮没有反应_u盘插入电脑无反应怎么解决 u盘插入电脑无反应解决方法【步骤介绍】...

u盘的轻巧、便捷使其在生活工作中重要的工具设备&#xff0c;在使用u盘的过程中插入的 u盘无法识别 &#xff0c;电脑对插入的u盘无反应&#xff0c;遇到这样的问题该怎么办呢?接下来小编就和大家介绍 电脑无法识别u盘 的解决办法。1 、使用其它的移动设备插在电脑usb接口上&a…

recaptcha_与reCAPTCHA的Spring集成

recaptcha有时我们只需要CAPTCHA &#xff0c;这是一个可悲的事实。 今天&#xff0c;我们将学习如何与reCAPTCHA集成。 因为主题本身并不是特别有趣和高级&#xff0c;所以我们将通过使用Spring Integration处理低级细节来过度设计&#xff08;&#xff1f;&#xff09;。 Goo…