POJ 1330 — Nearest Common Ancestors
2015-04-20 18:22
197 查看
原题:http://poj.org/problem?id=1330
裸的lca,只不过根不能从1开始
裸的lca,只不过根不能从1开始
#include<stdio.h> #include<string.h> #include<queue> #include<iostream> #include<algorithm> using namespace std; const int N = 10005; bool vis ; int head , fa [20], dep ; int n, e; queue<int>q; struct node { int to, nex; }edge[N<<1]; void add(int u, int v) { edge[e].to = v; edge[e].nex = head[u]; head[u] = e++; } void bfs(int root) { fa[root][0] = root; dep[root] = 0; q.push(root); while(!q.empty()) { int u = q.front(); q.pop(); for(int i = 1;i<20;i++) fa[u][i] = fa[fa[u][i-1]][i-1]; for(int i = head[u];i!=-1;i = edge[i].nex) { int v = edge[i].to; if(v == fa[u][0]) continue; dep[v] = dep[u]+1; fa[v][0] = u; q.push(v); } } } int lca(int x, int y) { if(dep[x]<dep[y]) swap(x, y); for(int i = 0;i<20;i++) { if((dep[x]-dep[y])&(1<<i)) x = fa[x][i]; } if(x == y) return x; for(int i = 19;i>=0;i--) { if(fa[x][i]!=fa[y][i]) { x = fa[x][i]; y = fa[y][i]; } } return fa[x][0]; } int main() { int cas; scanf("%d", &cas); while(cas--) { e = 0; memset(head, -1, sizeof(head)); memset(vis, false, sizeof(vis)); scanf("%d", &n); for(int i = 1;i<n;i++) { int a, b; scanf("%d%d", &a, &b); add(a, b); add(b, a); vis[b] = true; } int r; for(int i = 1;i<=n;i++) { if(!vis[i]) { r = i; break; } } bfs(r); int a, b; scanf("%d%d", &a, &b); printf("%d\n", lca(a, b)); } return 0; }
相关文章推荐
- POJ 1330 Nearest Common Ancestors
- POJ 1330 Nearest Common Ancestors(Tree)
- POJ1330 Nearest Common Ancestors【最近公共祖先】【Tarjan-LCA算法】
- POJ 1330 Nearest Common Ancestors(LCA模板)
- Nearest Common Ancestors(poj 1330)
- 【Poj 1330】Nearest Common Ancestors
- poj1330 Nearest Common Ancestors
- POJ 1330 Nearest Common Ancestors LCA
- POJ 1330 Nearest Common Ancestors LCA--》RMQ or 纯DFS
- [POJ 1330]Nearest Common Ancestors[LCA](O(dep[u] + dep[v]))
- POJ 1330 Nearest Common Ancestors(LCA 可以用ST算法 NlogN 或者简单搜索)
- POJ 1330 Nearest Common Ancestors
- 【POJ1330】Nearest Common Ancestors(树链剖分求LCA)
- POJ-1330 Nearest Common Ancestors(lca模板题)
- poj1330 Nearest Common Ancestors(LCA离线算法)
- poj----1330Nearest Common Ancestors(简单LCA)
- kyeremal-poj1330-Nearest Common Ancestors-最近公共祖先
- poj 1330 Nearest Common Ancestors(LCA:最近公共祖先)
- POJ 1330 Nearest Common Ancestors
- poj1330 Nearest Common Ancestors pascal代码