LCA模板——倍增法
2015-06-11 13:03
423 查看
POJ1330
[code]#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <vector> using namespace std; typedef long long LL; const int MOD = 1e9 + 7; const int INF = 0x7fffffff; const int N = 10000 + 10; const int LOG = 20; vector<int> G ; int parent[LOG] ; int depth ; void dfs(int v, int p, int d) { parent[0][v] = p; depth[v] = d; for (int i = 0; i < G[v].size(); i++) if (G[v][i] != p) dfs(G[v][i], v, d + 1); } void init(int root, int V) { dfs(root, -1, 0); for (int k = 0; k + 1 < LOG; k++) { for (int v = 0; v < V; v++) { if (parent[k][v] < 0) parent[k + 1][v] = -1; else parent[k + 1][v] = parent[k][parent[k][v]]; } } } int lca(int u, int v) { if (depth[u] > depth[v]) swap(u, v); for (int k = 0; k < LOG; k++) { if ((depth[v] - depth[u]) >> k & 1) v = parent[k][v]; } if (u == v) return u; for (int k = LOG - 1; k >= 0; k--) { if (parent[k][u] != parent[k][v]) { u = parent[k][u]; v = parent[k][v]; } } return parent[0][u]; } bool isroot ; int main() { #ifdef TYH freopen("in.txt", "r", stdin); #endif // TYH int T, n; scanf("%d", &T); while(T--) { scanf("%d", &n); int a, b; for(int i = 0; i < n; i++) { G[i].clear(); isroot[i] = true; } for(int i = 0; i < n - 1; i++) { scanf("%d%d", &a, &b); a--, b--; G[a].push_back(b); G[b].push_back(a); isroot[b] = false; } int root = 0; for(int i = 0;i<n;i++){ if(isroot[i] == true) root = i; } init(root, n); scanf("%d%d", &a, &b); a--, b--; printf("%d\n", lca(a, b) + 1); } return 0; }
相关文章推荐
- Cookie/Session机制详解
- 统计大量文本中重复字符串的最大个数
- SAT几何专业词汇一览
- dllimport&dllexport
- MatrixState中的参数与 CP_Na_Cl中参数的比较
- 正则表达式说明
- lldb 调试
- 数字证书简介
- 艾森哲面试 Accenture
- Struts2获取演示示例教程
- win7开机提示未能连接一个windows服务的详细解决办法
- Jquery绑定事件
- C++ Prim算法构造可以使n个城市连接的最小生成树
- Python 2.7 Data Type for Text Strings: Unicode and Str
- poj 1125 Stockbroker Grapevine(多源最短)
- html按钮跳转
- 斗牛游戏的概率探索
- 喇叭的声音和素质成反比--2008-06-27 博客搬家
- C++判断用户输入路径是否正确(判断盘符是否存在以及“\”与"/")
- 视频网址编码