您的位置:首页 > 房产 > 家装 > 算法提高模板LCA

算法提高模板LCA

2024/12/23 15:24:48 来源:https://blog.csdn.net/2301_80882026/article/details/142096341  浏览:    关键词:算法提高模板LCA

在这里插入图片描述

模板:

#include<bits/stdc++.h>using namespace std;typedef long long ll;
const int MOD = 998244353;
const int N = 2e5 + 10;int n, m, s, a, b;
vector<int>e[N];
int dep[N], fa[N][20];//深度
//第u个节点向上走2的i次方之后所对应的祖先
void dfs(int u, int father)
{dep[u] = dep[father] + 1;fa[u][0] = father;//初始化递归的第一项for(int i = 1; i <= 19; i ++){fa[u][i] = fa[fa[u][i - 1]][i - 1];}for(int v : e[u]){if(v != father) dfs(v, u);}
}int lca(int u, int v)
{if(dep[u] < dep[v]) swap(u, v);//先跳到同一层for(int i = 19; i >= 0; i --){if(dep[fa[u][i]] >= dep[v]){u = fa[u][i];}//一步一步的跳}if(u == v) return v;for(int i = 19; i >= 0; i --){if(fa[u][i] != fa[v][i]){u = fa[u][i], v = fa[v][i];}}return fa[u][0];
}
int main()
{cin >> n;while(n --){cin >> a >> b;if(b == -1) s = a;else {e[a].push_back(b);e[b].push_back(a);}}dfs(s, 0);cin >> m;while(m --){cin >> a >> b;int o = lca(a, b);if(o == a) cout << 1 << endl;else if(o == b) cout << 2 << endl;else cout << 0 << endl;}return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com