最近公共祖先(在线查询)

家族关系查询系统.zip 家族关系查询系统源代码以及各个方法的功能说明 立即下载

和上一篇博客是同一题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000") //不需要申请系统栈
const int N = 400010;
const int M = 25;
int dp[2*N][M];  //这个数组记得开到2*N,因为遍历后序列长度为2*n-1
bool vis[N];
struct edge
{
    int u,v,w,next;
}e[2*N];
int tot,head[N];
inline void add(int u ,int v ,int w ,int &k)
{
    e[k].u = u; e[k].v = v; e[k].w = w;
    e[k].next = head[u]; head[u] = k++;
    e[k].u = v; e[k].v = u; e[k].w = w;
    e[k].next = head[u]; head[u] = k++;
}
int ver[2*N],R[2*N],first[N],dir[N];
//ver:节点编号 R:深度 first:点编号位置 dir:距离
void dfs(int u ,int dep)
{
    vis[u] = true; ver[++tot] = u; first[u] = tot; R[tot] = dep;
    for(int k=head[u]; k!=-1; k=e[k].next)
        if( !vis[e[k].v] )
        {
            int v = e[k].v , w = e[k].w;
            dir[v] = dir[u] + w;
            dfs(v,dep+1);
            ver[++tot] = u; R[tot] = dep;
        }
}
void ST(int n)
{
    for(int i=1;i<=n;i++)
        dp[i][0] = i;
    for(int j=1;(1<<j)<=n;j++)
    {
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            int a = dp[i][j-1] , b = dp[i+(1<<(j-1))][j-1];
            dp[i][j] = R[a]<R[b]?a:b;
        }
    }
}
//中间部分是交叉的。
int RMQ(int l,int r)
{
    int k=0;
    while((1<<(k+1))<=r-l+1)
        k++;
    int a = dp[l][k], b = dp[r-(1<<k)+1][k]; //保存的是编号
    return R[a]<R[b]?a:b;
}

int LCA(int u ,int v)
{
    int x = first[u] , y = first[v];
    if(x > y) swap(x,y);
    int res = RMQ(x,y);
    return ver[res];
}

int main()
{

    int n;
    while(~scanf("%d",&n))
    {
        int q,num = 0;
        memset(head,-1,sizeof(head));
        memset(vis,false,sizeof(vis));
        int root;
        for(int i=0; i<n; i++)
        {
            int u,v,w;
            scanf("%d%d",&u,&v);
            if(v==-1)
                root=u;
            else
            add(v,u,1,num);
        }
        tot = 0; dir[1] = 0;
        dfs(root,1);
        /*printf("节点ver "); for(int i=1; i<=2*n-1; i++) printf("%d ",ver[i]); cout << endl;
        printf("深度R "); for(int i=1; i<=2*n-1; i++) printf("%d ",R[i]);   cout << endl;
        printf("首位first "); for(int i=1; i<=n; i++) printf("%d ",first[i]);    cout << endl;
        printf("距离dir "); for(int i=1; i<=n; i++) printf("%d ",dir[i]);      cout << endl;*/
        ST(2*n-1);
        scanf("%d",&q);
        while(q--)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            int lca = LCA(u,v);
            if(u==lca)
                printf("1\n");
            else if(v==lca)
                printf("2\n");
            else
                printf("0\n");
        }
    }
    return 0;
}
家族关系查询系统 课程实践相关的C语言做的家族关系查询系统 立即下载

相关推荐

cst使用局部网格加密,手动加密,special设置等方法合理网格布局加速仿真速度

在CST中,计算复杂模型或者阵列的时候往往需要耗费大量仿真时间,除了使用更高性能的电脑或工作站进行仿真,合理对CST的仿真网格进行适当设置也是必不可少的一步。CST中网格设置影响模拟的精度和速度,因此花时间理解网格过程是很重要的。

OVEN_b612的博客 1万+

C/C++家族关系查询系统[2023-10-19]

1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。(2)家谱中成员的信息中均应包含姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)等,也可附加其它信息,并存储于文本文件中。(3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息,查找家族成员的祖先路径、确定成员是家族中的第几代。5).按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)(4)按出生日期对家谱中所有人排序。

程序设计 434

Verilog实战:手把手教你实现四路组相联Cache(附完整代码解析)

本文提供了一份详细的Verilog实战指南,手把手教你实现一个四路组相联Cache。内容涵盖从设计规格、核心存储阵列、LRU替换策略到状态机设计的完整流程,并附有代码解析与优化技巧,旨在帮助硬件设计者掌握Cache控制器的RTL实现与调试方法。

pp12345的博客 515

C++ 家族关系查询

使用的语言:C++ 题目:家族关系查询

害怕也得前进 4843

TVS 和压敏电阻联合使用进行浪涌保护时,压敏电阻的压敏电压要低于TVS 的钳位电压 VC。

通过先让MOV接管,可以确保在大多数情况下,电压不会迅速上升到TVS二极管的钳位电压,从而保护TVS二极管免受持续高能量冲击的损害。总结来说,将MOV的压敏电压设置得低于TVS二极管的钳位电压,可以提供一种分级的保护机制,优化浪涌保护性能,同时保护敏感的TVS二极管不被过度的能量冲击损坏,并延长其使用寿命。MOV吸收的能量(Wmov):假设浪涌电流为10kA,MOV导通后将电压限制在300V,那么Wmov = Ipp * Vmov = 10kA * 300V = 3MW。例如,Vmov可以设定为275V。

weixin_66642980的博客 2244

C++/WinRT入门指南:现代Windows原生开发的核心技术

Windows运行时(WinRT)是微软为现代Windows应用开发设计的一套跨语言API框架,它基于COM技术原理构建,提供了统一的二进制接口标准。这项技术的核心价值在于让开发者能够以原生性能调用系统级功能,同时保持跨语言兼容性。在工程实践中,C++/WinRT作为官方推荐的C++语言投影,通过标准C++语法封装WinRT API,显著降低了开发复杂度。特别是在异步编程场景中,结合C++20协程特性,能够大幅提升代码可读性和维护性。对于需要高性能图形处理、系统集成或跨平台兼容的桌面应用开发,掌握C++/W

weixin_33910191的博客 1196

家族关系查询系统程序设计算法思路_家族关系查询系统

家族关系查询系统1.问题描述建立家族关系数据库,实现对家族成员关系的相关查询。2.基本要求(1)建立家族关系并能存储到文件中;(2)实现家族成员的添加。(3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。3.扩展功能在家族关系查询中包含了许多查询功能,可通过输入不同的命令和参数有选择的实现各种查询。在编写程序时,可以加入修改成员信息的功能并能及时更新保存。数据结构的课程设计,用的三叉树,S...

weixin_28965739的博客 2988

保姆级教程:在Windows上用Docker Desktop一键部署Dify 1.0.1(附国内镜像加速)

本文提供在Windows系统上使用Docker Desktop快速部署Dify 1.0.1的详细教程,包括环境准备、国内镜像加速配置、Dify容器部署实战及常见问题解决方案。特别针对国内用户优化,确保快速完成部署并提升开发效率。

weixin_33738555的博客 280

家族关系查询系统程序设计算法思路_七大查找算法(附C语言代码实现)

来自:Poll的笔记 - 博客园链接:http://www.cnblogs.com/maybe2030/p/4715035.html阅读目录 1、顺序查找2、二分查找3、插值查找4、斐波那契查找5、树表查找6、分块查找7、哈希查找查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二...

weixin_39638801的博客 1183

Golang内存管理:GC调优实战案例

在Golang编程中,内存管理是一个非常重要的方面。良好的内存管理可以提高程序的性能和稳定性,而GC(垃圾回收)调优则是优化内存管理的关键手段。本文的目的就是通过实际案例,深入讲解Golang中GC调优的方法和技巧,让读者能够在实际项目中更好地进行内存管理和性能优化。范围涵盖了从核心概念的解释到具体代码实现和调优过程的详细分析。本文首先会介绍一些相关的术语和核心概念,让读者对Golang内存管理和GC有一个基本的认识。然后通过故事引入的方式,更加形象地解释核心概念及其相互关系。

AI Agent Harness Engineering 1118

[STM32F103C8T6]W5500+Modbus TCP(HAL库)

本章节是博主学习Modbus TCP所写的一篇文章Modbus TCP是Modbus的一个分支,主要用到网口通信的,在工业上也用的很频繁,我们公司最近的项目就是用的W5500+modbus TCP来和PC端的上位机通信和交互的。虽然这个项目不是我在写代码,但是我都学了Modbus RTU了,那我也抽空学习一下Modbus TCP吧。本次的Modbus TCP不是博主写的,是一个大佬开源的一个W5500写的一个Mobus TCP代码,我在这个基础上自己写了主机读从机多个数据,和主机写从机寄存器的函数。

sinat_58149788的博客 4085

在线查询树上最近公共祖先

在线查询树上最近公共祖先 可能有较为详细的算法解释。

YQAccelerator 651

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

在二叉树中找到两个节点的最近公共祖先(进阶)

在二叉树中找到两个节点的最近公共祖先(进阶) 题目描述 给定一棵二叉树,多次给出这棵树上的两个节点 o1 和 o2,请对于每次询问,找到 o1 和 o2 的最近公共祖先节点。 输入描述: 第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。 以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa 没有左儿子,rch同理) 第 n+2 行输入一个整数 m,表示询问的次数。 以下 m 行每

MIC10086的博客 535

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LCA 最近公共祖先 (笔记、模板)

求lca的方法大体有三种: 1.dfs+RMQ(线段树 ST表什么的) 在线 2.倍增 在线 3.tarjan 离线 ps:离线:所有查询全输入后一次解决 在线:有一个查询输出一次 以下模板题为 洛谷 P3379 【模板】最近公共祖先(LCA) 1.首先dfs求出 1&gt;dfs遍历时经过的所有节点的位置 2&gt;每个节点第一次出现的位置 3&gt;每个节点的深...

Tricksterism 540

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hdu 2586 最近公共祖先

题目链接题意n个村子,被n-1个条边连接,每次询问u和v的最近距离。解析 求u和v的到他们的最近公共祖先的距离即可。 基本算法 在线算法 倍增法 每次询问O(logN) d[i] 表示 i节点的深度, p[j,i] 表示 i 的 2^j 倍祖先 那么就有一个递推式子 p[j,i]=p[p[j,i-1],i-1] 这样子一个O(NlogN)的预处理求出每个节点的 2^k 的祖先 然后对于每

NLSQQ的博客 391

51nod 2599 最近公共祖先(LCA) (ST表求LCA模板)

51nod 2599 最近公共祖先(LCA) 题目 裸 LCA,给一颗 n 个节点, n-1 条边的树,m次查询求任意两点LCA。 算法介绍 求 LCALCALCA 可以用离线 TarjianTarjianTarjian算法,算法复杂度O(n + m)。 还有一种离线的算法,预处理O(nlogn),在线查询O(1)。就是用STSTST表求LCA。 首先介绍欧拉遍历序,给一颗树,从根节点遍历: 欧...

Stormjing的博客 843

最后复习之最近公共祖先

据我所知最有两种算法:倍增、tarjan 一、倍增: 倍增这个思想适用性很强,有很多变形,树上倍增可以求lca,链上倍增(就是st算法)可以求解rmq问题。 基本过程:预处理每个点的深度和每个点2的i次方(2的i次方小于这个点的深度)的祖先是谁,然后对于每次询问,将这两个点先跳到同样深度,然后一齐向上跳,只要可以跳就提高速度,不然就降低速度,直到成为最近公共祖先节点的儿子后(就是速度小于0的时

a1846407618的博客 396

最近公共祖先(LCA)数据结构的Java实现详解

递归法是最简单直观的实现,适用于二叉树场景,代码简洁但功能有限倍增法是通用性最强的方法,支持多叉树和在线查询,预处理后查询效率高Tarjan算法适合离线批量查询,整体效率最高,但需要预先知道所有查询如果只是简单的二叉树问题,使用递归法即可如果需要支持频繁的在线查询,推荐使用倍增法如果有大量已知的查询请求,Tarjan算法是最佳选择。

qq_54076831的博客 278

P3379 【模板】最近公共祖先(LCA)

摘要:本文实现了一个基于二进制跳转的LCA(最近公共祖先)算法。给定一棵有根树和M个查询,对每个查询(a,b)返回它们的最近公共祖先。算法首先通过DFS预处理每个节点的深度和二进制跳转表(father数组),然后在查询时先调整节点到相同深度,再利用二进制跳转快速找到LCA。时间复杂度为O(NlogN)预处理和O(logN)查询,适用于大规模树结构查询。代码使用邻接表存储树结构,并通过动态规划预处理跳转信息,最后高效处理每个查询。

chenguantong的博客 36

LCA问题

关于RMQ(ST实现)方面的博文 Tarjan算法,基于并查集和dfs,是离线算法,离线就是将所有查询先存起来,一次性处理 dfs+ST算法 ,在线算法,每一次查询,都会处理一次 dfs+RMQ,在线算法 Tarjan 算法: 例题:POJ - 1330 题目大意是输入t,有t组数据,每组数据的第一行为n,接下来有n对(a,b),前n-1对表示边,a是b的父;最后一对是查询a,b的最近公共祖...

nowting的博客 219

最近公共祖先

任意一点出发一直走到根节点,并把途径的所有点标记下来(设置一个标记数组),然后从另一个点出发往根节点走,则这个点第一次走到的被标记的点就是它们的最近公共祖先。在有根树中,每个点又会有很多祖先(特殊的,自己也算是自己的祖先。我的祖先的祖先也是我的祖先),给定两个点,求距离他们最近的公共祖先就是最近公共祖先。,那么其他节点的深度就等于:该点到根节点的距离再加上一。所以说,设置这个哨兵可以防止越界带来的影响,简化了问题。最坏的情况下,所有点在一条链上,需要遍历整条链。所在树的深度,规定根节点的深度为。

jyyyyx的算法之旅 1081

最近公共祖先学习小结1——在线倍增

学习时看网上资料空讲,难以理解,还是自己动手画一画,才好理解。这里记录下来,以防自己过久了忘记。切入正题先了解个概念: 最近公共祖先(Lowest Common Ancestors)(简称LCA),简单讲就是指在树上几个节点共有的祖先节点中,最近的那一个。 例如:3祖先(父亲)节点是2,1、4的祖先(父亲)节点是6,2,1,那么2,1就是这两个点的公共祖先节点,而2离这两个最近,所以2是他们的L

Last_Freezen_yue的博客 660

[学习笔记]lca-倍增

The article is to Jimmy.(方老师讲过了还不会,想怎样???) The airticle is to Seakway.(我真的打过代码并且讲过了!!!) 求一棵树上两个节点的最近公共祖先有两种算法: (离线); 倍增(在线). 这篇博客只介绍倍增的写法. 表示节点的祖先中,与节点距离为的节点编号. 那么 每次查询两个节点的时,现将深度深的点向上移,直到两个点的...

weixin_30363817的博客 92

POJ 1330 Nearest Common Ancestors

Nearest Common AncestorsTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 32422 Accepted: 16495DescriptionA rooted tree is a well-known data structure in computer science and engineering. An e...

shyoldman的博客 182
上一篇: 最近公共祖先(离线)
下一篇: 骨牌覆盖(矩阵快速幂)
acmer_zp
博客等级 码龄11年 18粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值