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