记录dfs序列,dfn[tot] 记录第tot次访问的节点

然后查两点在dfs序中出现的第一次 id[u] id[v]

然后  找 dep[k] = min( dep[i] ) {i 属于 [id[u], id[v]]}

最后dfn[k] 就是所求..

感觉弄来弄去 就是 在映射... 无非就是 求一段序列深度最小的节点编号

#include <bits/stdc++.h>
using namespace std;const int N = 2e5+10;int n, cnt, tot, dp[N][21]; // dp[i][j] [i, i+(1<<j)-1]
vector<int> G[N]; map<string ,int> mp;
string s1,s2,s[N];int dfn[N], id[N], dep[N];
int getId(string str)
{if(mp[str]) return mp[str];mp[str] = ++cnt;s[cnt] = str;return cnt;
}void dfs(int u,int fa,int d)
{id[u] = tot;dfn[tot] = u;dep[tot++] = d;for(int i=0; i<G[u].size(); i++) {int v = G[u][i];dfs(v, u, d+1);dfn[tot] = u;dep[tot++] = d;}return ;
}void st_init(int sz)
{for(int i=1; i<=sz; i++) dp[i][0] = i;for(int j=1; (1<<j)<=sz; j++){for(int i=1; i+(1<<j)-1<=sz; i++){int x = dp[i][j-1];int y = dp[i+(1<<(j-1))][j-1];if(dep[x] < dep[y])dp[i][j] = x;else dp[i][j] = y;}}
}void init()
{tot = 1;dfs(1, 0, 0);st_init(tot-1);
}int query(int u,int v)
{u = id[u], v = id[v];if(v < u)swap(v,u);int t = log2(v-u+1);int x = dp[u][t];int y = dp[v-(1<<t)+1][t];if(dep[x] < dep[y])return x;else return y;
}
int main()
{freopen("in.txt","r",stdin);ios::sync_with_stdio(0);cin >> n;for(int i=0; i<n; i++) {cin >> s1 >> s2;int u = getId(s1);int v = getId(s2);G[u].push_back(v);}init();int m; cin >> m;for(int i=0; i<m; i++) {cin >> s1 >> s2;int u = getId(s1);int v = getId(s2);int x = dfn[query(u,v)];cout << s[x] <<"\n";}return 0;
}

转载于:https://www.cnblogs.com/Draymonder/p/10010241.html

hihoCoder week17 最近公共祖先·三 lca st表相关推荐

  1. hihocoder #1069 : 最近公共祖先·三(ST求LCA)

    题目:http://hihocoder.com/problemset/problem/1069?sid=1175440 思路:就是map存储求LCA,然而开始模板弄错了,wa了n次 代码: #incl ...

  2. 「LuoguP3379」 【模板】最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  3. 洛谷P3379 【模板】最近公共祖先(LCA)

    洛谷P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数 ...

  4. 【树上算法】最近公共祖先(LCA)

    最近公共祖先 前言 最近公共祖先是在树上的一个算法.这里就提到了树.树想必大家都再熟悉不过了,在计算机中,我们可以把树看成一种特殊的图. 这种图就叫有向无环联通图.顾名思义,没有环,有向图,nnn个节 ...

  5. 最近公共祖先(LCA)Tarjan

    P3379 [模板]最近公共祖先(LCA) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1.Tarjan 观察这样一棵树,假设要求LCA(3,4),根据dfs我们会先向下搜索 我 ...

  6. 【转】最近公共祖先(LCA)

    [转]最近公共祖先(LCA) LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. ---来自百度百科 例如: 在这棵树中 17 ...

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

    lca最近公共祖先,是指两个点最近的祖先节点:求lca我知道的有三种倍增, st表,tarjan,我要介绍的是倍增,我才不会告诉你我只会这一个. 话说我学lca可真的路途曲折,在qbxt,lcy da ...

  8. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

  9. [最近公共祖先(LCA)]

    首先这个题 很毒瘤 被数据卡了 很长时间 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问 ...

最新文章

  1. blf文件用什么软件打开_如何用皕杰流程创建一个blf演示流程文件?
  2. java mongodb排序查询_java操作mongodb基础(查询 排序 输出list)
  3. 【译】Economics of Fees and Gas
  4. openjpa_以编程方式向OpenJPA注册实体类型
  5. LINQ系列:LINQ to XML操作
  6. Spring Boot笔记-拦截器相关(用户权限方面)
  7. PAT 1012 数字分类 (20)
  8. okHttp3 源码分析
  9. 方向导数、梯度与梯度下降
  10. java实现数据的Excel导出(合并单元格、样式等)
  11. 用SQL Server(T-SQL)获取连接字符串
  12. OpenInfra中国日志愿者第三次会议召开
  13. 分享个Duilib中基于wke的浏览器控件
  14. matlab-模拟退火算法
  15. win7安装python3.7失败_win7安装python3.7出现setup failed,成功解决
  16. 360浏览器出现https证书错误怎么办
  17. 关于《算法(第四版 谢路云译)》标准库In、Out、StdOut和StdIn的正确配置和调用经验分享(以BinarySearch二分查找算法为例)
  18. Android 生成自己的签名key(releasekey platform shared media networkstack verify等)
  19. 苹果电脑php开发工具,Mac系统下给力的PHP开发工具
  20. 笨木头Lua专栏 函数的几个特别之处

热门文章

  1. C#-通过OpcUA监控设备
  2. 每日一练:Python国内疫情数据爬取与地图绘制
  3. 概率论与数理统计の笔记
  4. 在cmd环境下操作Oracle11g数据库
  5. rat/rats--用有理数形式表示矩阵
  6. int * * a[10] int * (*a)[10]和 int(*a[10])() 是什么意思
  7. This function or variable may be unsafe
  8. BP神经网络 语音信号分类
  9. 优酷路由宝刷梅林_优酷路由宝刷breed(不死)教程
  10. php start,php start.php start 报错