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…

计算机管理home,电脑home键是什么意思

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。以win7为例&#xff0c;电脑键盘上的Home键是微软Windows操作系统中具有返回功能的按键&#xff0c;根据Windows不同的操作环境&#xff0c;home键的功能也会有区别。电脑(computer&…

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

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

go token验证_registry v2 解析以及如何实现token验证

提到registry v2&#xff0c;主要改进是支持并行pull镜像&#xff0c;镜像层id变成唯一的&#xff0c;解决同一个tag可能对应多个镜像的问题等等。如果还不太了解&#xff0c;可以且听我细细道来。首先不得不说的是v2 新加了一个概念Digest他是基于内容进行寻址(Content-addres…

创建一个简单的 MDM server(1)

前提&#xff1a;已获得 APNS 证书 &#xff0c;已完毕 MDM 配置描写叙述文件的制作。请參考《 MDM 证书申请流程 》一文和《配置MDM Provisioning Profile》。环境&#xff1a;OSX 10.9.2&#xff0c;JDK 1.6。Eclipse JavaEE Helois&#xff0c;Tomcat 7.0一、前言《THE IOS …

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在满足典型需求时必须提供的内容…

Digui

public class Digui{ public static void main(String args[]){ System.out.println("计算结果&#xff1a;" sum(100)) ; //调用操作 } public static int sum(int num){ //定义方法用于求和操作 if(num 2){ //判断是否是加到了最后一个数 return 2 ; }else{ retur…

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

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

计算机组成原理mbps,2016年湖北师范学院计算机组成原理(同等学力加试)复试笔试仿真模拟题...

一、选择题1&#xff0e; 若x103&#xff0c;y-25, 则下列表达式采用8位定点补码运算实现时&#xff0c;会发生溢出的是( )A.xyB.-xyC.x-yD.-x-y【答案】c2&#xff0e; 假定一台计算机的显示存储器用DRAM 芯片实现&#xff0c;若要求显示分辨率为1600x1200&#xff0c;颜色深度…

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 …

android 头像球_Android一行代码实现圆形头像

效果图在开发APP中&#xff0c;经常要实现圆形头像&#xff0c;那么该如何实现呢&#xff1f;要裁剪吗&#xff0c;要重写draw函数吗&#xff1f;不用&#xff0c;只用一行代码就可以实现Glide实现圆形图像Glide.with(mContext).load(R.drawable.iv_image_header).error(R.draw…

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, …

osgi 模块化_OSGI –模块化您的应用程序

osgi 模块化由于我是模块化&#xff0c;低耦合&#xff0c;高凝聚力等的大力拥护者&#xff0c;所以…… 我相信这项技术是我们使用Java平台创建应用程序的突破。 使用OSGi&#xff0c;创建高度可扩展的应用程序非常简单&#xff0c;例如参见Eclipse IDE。 我的目的不是要深入展…

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

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

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

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