hiho一下 第十五周——最近公共祖先·二(Trajan,离线LCA)
2015-03-09 13:21
549 查看
题目连接
http://hihocoder.com/problemset/problem/1067题目大意
就是一棵树求任意两个节点的最近公共祖先。算法描述
在题目的提示里面有比较详细的解释。这里就不多说了。这种算法的时间复杂度是O(n+q)。在算法的实现上也有一些技巧,在参考了一些代码后写了一个比较精简的Trajan_LAC算法。
[code]#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 ; vector <pair<int, int> > Query ; string Name ; int fa , ans ; 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; }
相关文章推荐
- hiho一下 第十五周 最近公共祖先·二 - 更新一下tarjan离线LCA模板
- hiho一下 第十七周 最近公共祖先·三 更新RMQ在线解LCA
- hihocoder 1067 最近公共祖先·二(tarjan LCA 离线算法O(n))
- hihoCoder_#1067_最近公共祖先·二(LCA+tarjan模板)
- 最近公共祖先(LCA):离线&在线算法
- hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]
- POJ 1330 最近公共祖先LCA(Tarjan离线做法)
- hdu2586 How far away? Tarjan(离线)算法求最近公共祖先LCA 待补完
- LCA 最近公共祖先 tarjan离线 总结 结合3个例题
- 【NOIp复习】最近公共祖先LCA&区间最大最小RMQ
- hiho刷题日记——第十三天最近公共祖先·一
- hiho#1062 : 最近公共祖先·一
- hdu2586&&poj1330 求点间最短距&&最近公共祖先(在线&&离线处理):::可做模板
- [HIHO1062] 最近公共祖先·一(lca, 并查集, 二分, 神trick)
- POJ 1330 LCA最近公共祖先 离线tarjan算法
- [hiho]#1067 : 最近公共祖先·二 离线算法
- hiho一下 第十七周 最近公共祖先
- 最近公共祖先lca离线
- POJ 1330 最近公共祖先LCA(Tarjan离线做法)
- LCA(最近公共祖先) 离线法(tarjan算法)