【算法】【树】最近公共祖先LCA——Tarjan算法
2014-08-31 11:31
549 查看
class LCA_problem { public: const static int N = 10000 + 10; int parent ; int ancester ; vector<int> tree ; vector<int> qes ; bool isroot ; bool visited ; int n; void init(int n) { for (int i = 1; i <= n; i++) { parent[i] = i; isroot[i] = true; ancester[i] = 0; visited[i] = false; qes[i].clear(); tree[i].clear(); } } int find(int u) { if (u != parent[u]) {parent[u] = find(parent[u]); return parent[u];} return u; } int union_(int x, int y) { int p1 = find(x); int p2 = find(y); if (p1==p2) return 0; parent[p1] = p2; return 1; } void lca(int u) { //模拟深度遍历,在遍历的过程中,回答查询问题; ancester[u] = u; int size = tree[u].size(); //printf("# %d %d\n", u, size); for (int i = 0; i < size; i++) { lca(tree[u][i]); union_(u, tree[u][i]); ancester[find(u)] = u; } visited[u] = true; size = qes[u].size(); for (int i = 0;i < size; i++) { if (visited[qes[u][i]]) { printf("%d\n", ancester[find(qes[u][i])]); return; } } } void solve() { int test_num, start, end; scanf("%d", &test_num); for (int t = 0; t < test_num; t++) { scanf("%d", &n); init(n); for (int i = 0;i < n-1; i++) { scanf("%d%d", &start, &end); tree[start].push_back(end); isroot[end] = false; } scanf("%d%d", &start, &end); qes[start].push_back(end); qes[end].push_back(start); for (int i = 1; i <= n; i++) { if (isroot[i]) { lca(i); break; } } } } };
相关文章推荐
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现
- 算法摘记 最近公共祖先LCA Tarjan算法
- 最近公共祖先LCA(Tarjan算法)的思考和算法实现
- 【并查集】【树】最近公共祖先LCA-Tarjan算法
- hdu2586How far away 最近公共祖先Lca tarjan算法
- 寻找最近公共祖先算法(LCA)
- hdu2586 How far away? Tarjan(离线)算法求最近公共祖先LCA 待补完
- 求LCA最近公共祖先的在线ST算法_C++
- 最近公共祖先LCA:Tarjan算法
- c++最近公共祖先LCA(倍增算法和tarjan)
- LCA 算法学习 (最近公共祖先)poj 1330
- LCA(最近公共祖先) 离线法(tarjan算法)
- POJ 1330 LCA最近公共祖先 离线tarjan算法
- LCA(最近公共祖先)Tarjan算法
- [算法] LCA 最近公共祖先 (Tarjan)
- LCA最近公共祖先——tarjan算法
- hdu2586-How far away ?(最近公共祖先(LCA),离线Tarjan算法)