题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4547

思路:这题的本质还是LCA问题,但是需要注意的地方有:

1、如果Q中u,v的lca为u,那么只需一步u->...->v。

2、如果Q中u,v的lca为v,那么需abs(dist[u]  - dist[v])步。

3、否则以上情况都不满足,那么需abs(dist[v] - dist[lca(u, v)])+1步。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
using namespace std; const int MAX_N = (400000 + 20000);
struct Edge {
int v, next;
} edge[MAX_N]; int NE, cnt, head[MAX_N], Indegree[MAX_N];
map<string, int > mp;
void Init()
{
mp.clear();
cnt = NE = 0;
memset(head, -1, sizeof(head));
memset(Indegree, 0, sizeof(Indegree));
} void Insert(int u, int v)
{
edge[NE].v = v;
edge[NE].next = head[u];
head[u] = NE++;
} struct q_edge {
int u, v, id, next;
} q_ee[MAX_N]; int q_ne, q_head[MAX_N];
void q_init()
{
q_ne = 0;
memset(q_head, -1, sizeof(q_head));
} void q_insert(int u, int v, int id)
{
q_ee[q_ne].u = u;
q_ee[q_ne].v = v;
q_ee[q_ne].id = id;
q_ee[q_ne].next = q_head[u];
q_head[u] = q_ne++;
} int N, M, ans[MAX_N], dist[MAX_N];
int parent[MAX_N], lca[MAX_N];
bool vis[MAX_N]; int Find(int x)
{
if (x == parent[x]) {
return parent[x];
}
return parent[x] = Find(parent[x]);
} void dfs(int u)
{
parent[u] = u;
vis[u] = true;
for (int i = q_head[u]; ~i; i = q_ee[i].next) {
int v = q_ee[i].v, id = q_ee[i].id;
if (vis[v]) { lca[id] = Find(v);
}
} for (int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].v;
if (!vis[v]) {
dist[v] = dist[u] + 1;
dfs(v);
parent[v] = u;
}
}
} int main()
{
int Cas;
cin >> Cas;
while (Cas--) {
cin >> N >> M; Init(); for (int i = 1; i < N; ++i) {
string str1, str2;
cin >> str1 >> str2;
if (mp.find(str1) == mp.end()) mp[str1] = ++cnt;
if (mp.find(str2) == mp.end()) mp[str2] = ++cnt; Indegree[mp[str1]]++;
Insert(mp[str2], mp[str1]);
} q_init(); for (int i = 1; i <= M; ++i) {
string str1, str2;
cin >> str1 >> str2;
q_insert(mp[str1], mp[str2], i);
q_insert(mp[str2], mp[str1], i);
} //from root;
memset(vis, false, sizeof(vis));
for (int i = 1; i <= cnt; ++i) {
if (!Indegree[i]) {
dist[i] = 0;
dfs(i);
break;
}
} for (int i = 0; i < q_ne; ++i) {
if (!(i & 1)) {
if (q_ee[i].u == q_ee[i].v) {
puts("0");
} else if (q_ee[i].u == lca[q_ee[i].id]) {
puts("1");
} else if (q_ee[i].v == lca[q_ee[i].id]) {
printf("%d\n", abs(dist[q_ee[i].v] - dist[q_ee[i].u]));
} else {
printf("%d\n", abs(dist[q_ee[i].u] - dist[lca[q_ee[i].id]]) + 1);
}
}
} }
return 0;
}



hdu 4547(LCA)的更多相关文章

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

    P3379 [模板]最近公共祖先(LCA) 152通过 532提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 为什么还是超时.... 倍增怎么70!!题解好像有 ...

  2. 图论--最近公共祖先问题(LCA)模板

    最近公共祖先问题(LCA)是求一颗树上的某两点距离他们最近的公共祖先节点,由于树的特性,树上两点之间路径是唯一的,所以对于很多处理关于树的路径问题的时候为了得知树两点的间的路径,LCA是几乎最有效的解 ...

  3. 面试题6:二叉树最近公共节点(LCA)《leetcode236》

    Lowest Common Ancestor of a Binary Tree(二叉树的最近公共父亲节点) Given a binary tree, find the lowest common an ...

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

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

  5. A * B Problem Plus HDU - 1402 (FFT)

    A * B Problem Plus HDU - 1402 (FFT) Calculate A * B.  InputEach line will contain two integers A and ...

  6. 洛谷P3379 【模板】最近公共祖先(LCA)(dfs序+倍增)

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

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

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

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

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

  9. luogo p3379 【模板】最近公共祖先(LCA)

    [模板]最近公共祖先(LCA) 题意 给一个树,然后多次询问(a,b)的LCA 模板(主要参考一些大佬的模板) #include<bits/stdc++.h> //自己的2点:树的邻接链表 ...

随机推荐

  1. <<< html图片背景平铺

    CSS背景图片平铺技巧 使用CSS来设置背景图片同传统的做法一样简单,但相对于传统控制方式,CSS提供了更多的可控选项,我们先来看看最基本的设置图片的方法.html代码: 代码如下: <divi ...

  2. ionic 界面数据缓存问题

    在ionic开发过程中列表到详情,在返回是可能存在,列表重新加载问题,不能回到用户上次点击的地方 在处理前期各种坑,把详情设置为弹出层,缓存数据等等,然而会出现各种问题,无意间发现一篇文章,一个属性解 ...

  3. Flash调用麦克风

    import flash.events.ActivityEvent;import flash.media.Microphone;var deviceArray:Array = Microphone.n ...

  4. input file控件限制上传文件类型

    网页上添加一个input file HTML控件: <input id="File1" type="file" /> 默认是这样的,所有文件类型都会 ...

  5. Java构造方法

  6. CSS3中的变形处理

    在css3中,可以利用transform功能来实现文字或者图像的旋转.缩放.倾斜.移动这四种类型的变形处理. 旋转 旋转功能使用rotate方法参数中加入角度值,方向为顺时针旋转.示例清单如下: &l ...

  7. ajax方法简单实现

    //option {url,medthod,type,data,fSuccess,fError} function ajax(option) { var xhr = window.XMLHttpRqu ...

  8. DTD总结

    DTD 可以检测 XNM 文档的结构是否正确,就好像文章中用来保证结构正确的语法规则一样. 引入 DTD 1.引入私有的 DTD 文件,URI 可以使相对地址或绝对地址 <!DOCTYPE 根元 ...

  9. LPC1768/1769之CAN控制器概述(附库函数下载地址)

    一.背景: 使用LPC1769来做CAN的收发,在此对使用LPC1769的CAN控制器进行收发做个总结和记录,以备下 次开发快速上手使用. 附:LPC1768/1769除了支持最高频率不同以外,其它基 ...

  10. C#之关机事件

    一.背景 做了个APP,通过向下位机发送串口数据,然后通过串口去控制多路光源,现在的问题来了,若是电脑强行关机,而APP又没在电脑关机前做任何动作,导致电脑已经关机了,而下位机控制的灯源还在工作.所以 ...