题目链接:点击查看

题目大意:给出一个层层嵌套的树状结构,可以从某一点通过一个操作直接到达任意一个子节点的位置,但如果要从某个节点到达其祖先节点需要一层一层往上爬,问若要从节点A到达节点B,需要多少步

题目分析:LCA模板题,需要修改的地方就是当节点B就是LCA的时候特判一下,然后直接用deep数组计算就行了

注意一下多组输入map记得清零,一开始忘清零,MLE了两发。。太蠢了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;unordered_map<string,int>mp;int n,m,limit;vector<int>node[N];int du[N];int deep[N],dp[N][20];void dfs(int u,int f,int dep)
{deep[u]=dep;dp[u][0]=f;for(int i=1;i<=limit;i++)dp[u][i]=dp[dp[u][i-1]][i-1];for(int i=0;i<node[u].size();i++)dfs(node[u][i],u,dep+1);
}int LCA(int x,int y)
{if(deep[x]<deep[y])swap(x,y);for(int i=limit;i>=0;i--)if(deep[x]-deep[y]>=(1<<i))x=dp[x][i];if(x==y)return x;for(int i=limit;i>=0;i--)if(dp[x][i]!=dp[y][i]){x=dp[x][i];y=dp[y][i];}return dp[x][0];
}void init()
{memset(du,0,sizeof(du));for(int i=1;i<=n;i++)node[i].clear();limit=log2(n)+1;mp.clear();
}int main()
{
//  freopen("input.txt","r",stdin);ios::sync_with_stdio(false);int w;cin>>w;while(w--){cin>>n>>m;init();int cnt=0;for(int i=1;i<n;i++){string a,b;cin>>a>>b;if(!mp[a])mp[a]=++cnt;if(!mp[b])mp[b]=++cnt;node[mp[b]].push_back(mp[a]);du[mp[a]]++;}for(int i=1;i<=n;i++)//找入度为0的点作为根节点if(!du[i]){dfs(i,i,0);break;}while(m--){string a,b;cin>>a>>b;int lca=LCA(mp[a],mp[b]);int ans;if(lca==mp[b])//特判一下终点ans=0;elseans=1;ans+=deep[mp[a]]-deep[lca];printf("%d\n",ans);}}return 0;
}

HDU - 4547 CD操作(LCA模板)相关推荐

  1. 【HDU 4547 CD操作】LCA问题 Tarjan算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547 题意:模拟DOS下的cd命令,给出n个节点的目录树以及m次查询,每个查询包含一个当前目录cur和 ...

  2. HDU 4547 CD操作

    传送门 没啥好说的.就是一个LCA. 不过就是有从根到子树里任意一个节点只需要一次操作,特判一下LCA是不是等于v.相等的话不用走.否则就是1次操作. 主要是想写一下倍增的板子. 倍增基于二进制.暴力 ...

  3. LCA模板(数剖实现)

    题目链接:https://www.luogu.org/problemnew/show/P3379 题意:LCA模板题. 思路:今天开始学树剖,先拿lca练练.树剖解lca,两次dfs复杂度均为O(n) ...

  4. python/数据库操作补充—模板—Session

    python/数据库操作补充-模板-Session 一.创建一个app目录 在models.py只能类进行进行创建表 1 class Foo: 2 xx= 字段(数据库数据类型) 3 字段类型 4 字 ...

  5. java读写word模板_Java操作Word模板插入列表

    Java操作Word模板插入列表 通过poi操作word,插入各种编号的列表,包括数字,字母,罗马字符,自定义任意字符.下面的示例就用了音乐符♬. 1.制作模板,插入列表使用语法*,模板内容为{{*n ...

  6. poi tl 判断空值_使用poi-tl操作word模板

    使用poi-tl操作word模板 1.导入jar包支持 com.deepoove poi-tl 1.8.2 2.建立word模板 在电脑E盘中建立word模板:"E:\templete.do ...

  7. C#操作Word模板并且修改书签

    原文地址:C#操作Word模板并且修改书签作者:大坏蛋 //生成WORD程序对象和WORD文档对象 Microsoft.Office.Interop.Word.Application appWord ...

  8. java word apache poi 操作word模板。

    apache poi 操作word模板. 操作方式: 1.对于固定格,可以遍历格子然后替换其中指定的值例如在要替换的cell写入${example} 这样格式,遍历到之后替换. 2.对于需要增长的表格 ...

  9. C++快速讲解(九):I/O操作、模板编程、容器、函数对象

    C++快速讲解(九):I/O操作.模板编程.容器.函数对象 1.I/O操作 1.1 基本输入输出 1.2 string 流 1.3 读取文件 1.4 写入文件 2.模板编程 2.1函数模板 2.1.1 ...

最新文章

  1. 环境变量、用户变量、系统变量
  2. 全球研发开支排名:亚马逊第一,BATJ排不上号!
  3. ubuntu16.04装机:网易云+搜狗拼音+chrome+uGet+caffe(openCV3.1+CUDA+cuDNN+python)
  4. 【POJ 2485】 Highways
  5. maven的环境搭建
  6. /和//在python中使用
  7. Firebug Lite——在没有调试工具的浏览器(如IE6-7)中调试
  8. EmEditor学习
  9. 自制Unity小游戏TankHero-2D(3)开始玩起来
  10. python字符串合并去重_015day--python集合和字符串
  11. java vector_Java Vector size()方法与示例
  12. echarts中x轴文件消失_实测实例:labview中波形图X轴刻度任意刻度设置
  13. oracle外部结合,浅谈Oracle外部文件
  14. 62.不同的路径(力扣leetcode) 博主可答疑该问题
  15. GUI图形用户界面设计
  16. 随机过程知识点学习与总结
  17. 码农小汪之理解Java注解。
  18. Apple’s Secret? It Tells Us What We Should Love
  19. Mariadb数据库
  20. add git 指定类型文件夹_git add 命令

热门文章

  1. max7219c语言,(转)MAX7219 C语言版驱动程序
  2. 什么时候你应该用JSON Web Token
  3. 集中式整合之加入springsecurity
  4. springboot-websocket-netty
  5. 什么是声明式事务控制
  6. python字典有什么用_在Python中使用范围作为字典键,我有什么选...
  7. python中output使用_python-02.输入Input/输出Output
  8. 【报错笔记】在maven项目中jsp页面使用window.location.href给controller传参时参数过长所以路径无法跳转至controller
  9. 65.4. Other GUI - phpOraAdmin
  10. 英语考试(最小生成树)