/*
* LCA在线算法(倍增法)
*/
const int MAXN = 10010;
const int DEG = 20; struct Edge
{
int to, next;
} edge[MAXN * 2]; int head[MAXN], tot;
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
} void init()
{
tot = 0;
memset(head, -1, sizeof(head));
} int fa[MAXN][DEG]; // fa[i][j]表示结点i的第2^j个祖先
int deg[MAXN]; // 深度数组 void BFS(int root)
{
queue<int>que;
deg[root] = 0;
fa[root][0] = root;
que.push(root);
while (!que.empty())
{
int tmp = que.front();
que.pop();
for (int i = 1; i < DEG; i++)
{
fa[tmp][i] = fa[fa[tmp][i - 1]][i - 1];
}
for (int i = head[tmp]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
if (v == fa[tmp][0])
{
continue;
}
deg[v] = deg[tmp] + 1;
fa[v][0] = tmp;
que.push(v);
}
}
} int LCA(int u, int v)
{
if (deg[u] > deg[v])
{
swap(u, v);
}
int hu = deg[u], hv = deg[v];
int tu = u, tv = v;
for (int det = hv-hu, i = 0; det ; det >>= 1, i++)
{
if (det & 1)
{
tv = fa[tv][i];
}
}
if (tu == tv)
{
return tu;
}
for (int i = DEG - 1; i >= 0; i--)
{
if (fa[tu][i] == fa[tv][i])
{
continue;
}
tu = fa[tu][i];
tv = fa[tv][i];
}
return fa[tu][0];
} bool flag[MAXN]; int main()
{
int T;
int n;
int u, v;
scanf("%d", &T); while(T--)
{
scanf("%d", &n);
init();
memset(flag, false, sizeof(flag));
for (int i = 1; i < n; i++)
{
scanf("%d%d", &u, &v);
addedge(u, v);
addedge(v, u);
flag[v] = true;
}
int root;
for (int i = 1; i <= n; i++)
{
if (!flag[i])
{
root = i;
break;
}
}
BFS(root);
scanf("%d%d", &u, &v);
printf("%d\n", LCA(u, v));
}
return 0;
}

最新文章

  1. chrome浏览器的跨域设置——包括版本49前后两种设置
  2. matlab 车牌分割的算法
  3. Scribe日志收集工具
  4. GLSL-几何着色器详解跟实例(GS:Geometry Shader)[转]
  5. 复制pdf文字出来是乱码的一种可能的解决方案
  6. MVVM学习笔记
  7. 京东电话面试——PHP开发
  8. python基础知识(引用)
  9. cf C. Dima and Salad
  10. C#基础:关键字和数据类型
  11. Android 启动Activity的方式
  12. Last Day in Autodesk
  13. 30.Mysql常见问题和应用技巧
  14. 自学Linux Shell3.1-帮助命令man
  15. 基于CentOS搭建VNC远程桌面服务
  16. spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
  17. 记录:CSS选择器学习
  18. 《Deep Learning》(深度学习)中文版 开发下载
  19. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例
  20. 【学习笔记】--- 老男孩学Python,day12 函数名的应用,闭包,迭代器

热门文章

  1. 模板继承和UImodul 和 UImethods
  2. 解决:docker-compose端口绑定
  3. 自动生成四则运算题目(C语言)
  4. Array(数组)对象--&gt;indexOf() 方法
  5. k8s Service学习
  6. Spring温习(1)--最基础的示例
  7. 【python实现卷积神经网络】定义训练和测试过程
  8. AJ学IOS(01) UI之Hello World与加法计算器
  9. 【做中学】第一个 Go 语言程序:漫画下载器
  10. 【Tool】IDEA配置Maven依赖管理