【题目链接】

点击打开链接

【算法】

分四种情况讨论 :

1. 当前目录和目标目录是同一目录,不需要变换,答案为0

2. 当前目录是目标目录的祖先,答案为当前目录的深度 - 目标目录的深度

3. 当前目录是目标目录的孩子,答案为1

4. 当前目录和目标目录有最近公共祖先,答案为当前目录的深度 - 最近公共祖先的深度 + 1

那么,算法就很明确了,先做一遍离线tarjan,求出询问点对的最近公共祖先,然后,进行上述的分类讨论

【代码】

由于目录名称是字符串,笔者用stl库里的map将这些目录重新编号

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define MAXL 45 struct Edge
{
int to,nxt;
} e[MAXN]; int i,T,tot,id,n,m,root;
int head[MAXN],dep[MAXN],f[MAXN],lca[MAXN],fa[MAXN];
string a,b;
string x[MAXN],y[MAXN];
bool visited[MAXN];
map<string,int> mp;
vector< pair<int,int> > query[MAXN]; inline void add(int u,int v)
{
tot++;
e[tot] = (Edge){v,head[u]};
head[u] = tot;
}
inline void init(int u)
{
int i,v;
for (i = head[u]; i; i = e[i].nxt)
{
v = e[i].to;
dep[v] = dep[u] + ;
init(v);
}
}
inline int find(int x)
{
if (f[x] == x) return x;
return f[x] = find(f[x]);
}
inline void tarjan(int u)
{
int i,v,pos;
visited[u] = true;
f[u] = u;
for (i = ; i < query[u].size(); i++)
{
v = query[u][i].first;
pos = query[u][i].second;
if (visited[v]) lca[pos] = find(v);
}
for (i = head[u]; i; i = e[i].nxt)
{
v = e[i].to;
tarjan(v);
f[v] = u;
}
} int main()
{ ios :: sync_with_stdio();
cin.tie(); cin >> T;
while (T--)
{
cin >> n >> m;
tot = id = ;
mp.clear();
for (i = ; i <= n; i++)
{
head[i] = ;
fa[i] = ;
visited[i] = false;
query[i].clear();
}
for (i = ; i < n; i++)
{
cin >> a >> b;
if (!mp[a]) mp[a] = ++id;
if (!mp[b]) mp[b] = ++id;
add(mp[b],mp[a]);
fa[mp[a]] = mp[b];
}
for (i = ; i <= n; i++)
{
if (!fa[i])
root = i;
}
dep[root] = ;
init(root);
for (i = ; i <= m; i++)
{
cin >> x[i] >> y[i];
query[mp[x[i]]].push_back(make_pair(mp[y[i]],i));
query[mp[y[i]]].push_back(make_pair(mp[x[i]],i));
}
tarjan(root);
for (i = ; i <= m; i++)
{
if (x[i] == y[i]) printf("%d\n",);
else if (lca[i] == mp[x[i]]) printf("%d\n",);
else if (lca[i] == mp[y[i]]) printf("%d\n",dep[mp[x[i]]]-dep[mp[y[i]]]);
else printf("%d\n",dep[mp[x[i]]]-dep[lca[i]]+);
}
} return ; }

【HDU 4547】 CD操作的更多相关文章

  1. HDU 4547 CD操作 (LCA最近公共祖先Tarjan模版)

    CD操作 倍增法  https://i.cnblogs.com/EditPosts.aspx?postid=8605845 Time Limit : 10000/5000ms (Java/Other) ...

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

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

  3. HDU 4547 CD操作

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

  4. hdu 4547 LCA **

    题意:在Windows下我们可以通过cmd运行DOS的部分功能,其中CD是一条很有意思的命令,通过CD操作,我们可以改变当前目录. 这里我们简化一下问题,假设只有一个根目录,CD操作也只有两种方式: ...

  5. lca讲解 && 例题 HDU - 4547

    一. 最普通的找树中两个点x,y最近公共祖先: 在进行lca之前我们要先对这一颗树中的每一个点进行一个编号,像下图一样.这个编号就是tarjan算法中的dfn[]数组 这样的话我们可以在跑tarjan ...

  6. hdu 4547(LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547 思路:这题的本质还是LCA问题,但是需要注意的地方有: 1.如果Q中u,v的lca为u,那么只需 ...

  7. hdu 5071 vector操作恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=5071 对于每一个窗口,有两个属性:优先级+说过的单词数,支持8个操作:新建窗口,关闭窗口并输出信息,聊天(置顶窗 ...

  8. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作

    一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...

  9. hdu 2034 - 集合操作

    题意:集合A,B,计算集合差A-B(求只在集合A内的数) 解法: 选用STL内的集合set 1.建立set 1: #include<set> 2:   3: set<int> ...

随机推荐

  1. 第二次:Ubuntu16.04 安装Docker

    sudo apt-get update, 就这一个命令执行了多半天,不知道网络缘故还是怎么的,管他呢,装完总是好的. # step 1: 安装必要的一些系统工具 sudo apt-get update ...

  2. 在移动端H5开发中(关于安卓端position:fixed和position:absolute;和虚拟键盘冲突的问题,以及解决方案)

    一.在开发移动端webapp时,我们经常会遇到这样的问题,当我们需要在页面底部固定一个logo或者说明时,往往会采用position:fixed进行固定定位或者absolute定位到最底部 这是一个很 ...

  3. <input type="button" /> 和<input type="submit" /> 的区别

    <input type="button" /> 这就是一个按钮.如果你不写javascript 的话,按下去什么也不会发生.<input type="s ...

  4. Zoj 3781(构造)

    Zoj 3781(构造) Zoj 3781 As we all know, Coach Gao is a talented chef, because he is able to cook M dis ...

  5. 【01】emmet系列之基础介绍

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 相关网址 官网:http: ...

  6. keil mdk uvision使用技巧

    语法检测&代码提示 中文友好: tab 可以选中一大块代码,一起缩进 快速注释 先选中你要注释的代码区,然后右键,选择Advanced,Comment Selection 就可以了 查找替换 ...

  7. java获取类的全类名----类名.class.getName()的作用是获取这个类的全类名

    类名.class.getName()的作用是获取这个类的全类名

  8. 添物不花钱学javaEE--CSS

    CSS是什么? CSS: Cascading Style Sheets CSS官方网址: https://www.w3.org/TR/2011/REC-CSS2-20110607/ 其实仔细研究这个就 ...

  9. POJ3352-Road Construction(边连通分量)

    It's almost summer time, and that means that it's almost summer construction time! This year, the go ...

  10. 使用SAX方式解析XML文件

    package com.pingyijinren.test; import android.util.Log; import org.xml.sax.Attributes; import org.xm ...