hiho一下 第十五周——最近公共祖先·二(Trajan,离线LCA)
来源:互联网 发布:ubuntu terminal 配置 编辑:程序博客网 时间:2024/05/17 02:18
题目连接
http://hihocoder.com/problemset/problem/1067
题目大意
就是一棵树求任意两个节点的最近公共祖先。
算法描述
在题目的提示里面有比较详细的解释。这里就不多说了。这种算法的时间复杂度是O(n+q)。
在算法的实现上也有一些技巧,在参考了一些代码后写了一个比较精简的Trajan_LAC算法。
#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MOD = 1e9 + 7;const int INF = 0x7fffffff;const int N = 1e5 + 10;map <string, int> ID;vector <int> G[N];vector <pair<int, int> > Query[N];string Name[N];int fa[N], ans[N];int findx(int x) { if(fa[x] == x) return x; else return fa[x] = findx(fa[x]);}void init(){ ID.clear(); memset(fa, -1, sizeof(fa));}void LCA(int u) { fa[u] = u; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; LCA(v); fa[v] = u; } for(int i = 0; i < Query[u].size(); i++) { pair <int, int> P = Query[u][i]; if(fa[P.first] != -1) { ans[P.second] = findx(P.first); } }}int main() {#ifdef TYH freopen("in.txt", "r", stdin);#endif // TYH int n, m; scanf("%d", &n); string father, son; int tot = 1; init(); for(int i = 0; i < n; i++) { cin >> father >> son; if(!ID[father]) ID[father] = tot, Name[tot++] = father; if(!ID[son]) ID[son] = tot, Name[tot++] = son; int x = ID[father], y = ID[son]; G[x].push_back(y); } scanf("%d", &m); string n1, n2; for(int i = 0; i < m; i++) { cin >> n1 >> n2; int x = ID[n1], y = ID[n2]; Query[x].push_back(make_pair(y, i)); Query[y].push_back(make_pair(x, i)); } LCA(1); for(int i = 0; i < m; i++) { cout << Name[ans[i]] << endl; } return 0;}
0 0
- hiho一下 第十五周——最近公共祖先·二(Trajan,离线LCA)
- hiho一下 第十五周 最近公共祖先·二 - 更新一下tarjan离线LCA模板
- HIHO #1067 : 最近公共祖先·二(并查集+dfs LCA离线算法)
- hiho刷题日记——第十五最近公共祖先·二
- hiho一下 第十七周 最近公共祖先·三 更新RMQ在线解LCA
- [hiho]#1067 : 最近公共祖先·二 离线算法
- hiho一下 第十七周 最近公共祖先
- 最近公共祖先lca离线
- 【hiho一下】 最近公共祖先 一
- hihocoder 1067 最近公共祖先·二(tarjan LCA 离线算法O(n))
- LCA最近公共祖先(tarjan离线算法)
- 最近公共祖先LCA离线算法
- 最近公共祖先(LCA)——离线Tarjan算法+并查集优化
- LCA 最近公共祖先——Tarjan(离线)算法的基本思路及其算法实现
- HiHo 第十三周 #1062 : 最近公共祖先·一 【map】
- hiho#1062 : 最近公共祖先·一
- HIHO #1062 : 最近公共祖先·一
- hiho第十三周 最近的公共祖先
- POJ 2253 Frogger
- 交换就修改telnet密码
- c/c++大纲
- MySQL dump步骤
- 2015 3.10-3.23
- hiho一下 第十五周——最近公共祖先·二(Trajan,离线LCA)
- unix信号处理机制
- 练习 bottom和函数
- C# 清除IE缓存方法
- Java多线程学习(吐血超详细总结)
- magento admin chrome firefox
- LeetCode:Subsets
- Linux删除日志文件和清除日志文件脚本
- 产品经理们都是怎样成为产品经理的?