【poj】lca模板题 poj1330
2015-07-30 13:32
483 查看
附题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11136
Nearest Common Ancestors
Submit Status
Description
A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:
View Code
最后想说的是,为什么会超时,似乎有点问题。。到时等理解更深后在来优化吧,代码没问题。就当做模板吧
Nearest Common Ancestors
Time Limit: 1000MS | Memory Limit: 10000KB | 64bit IO Format: %I64d & %I64u |
Description
A rooted tree is a well-known data structure in computer science and engineering. An example is shown below:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct edge{ int u,v,next; }e[10000 + 10]; int head[10000 + 10],k = 1; int deep[10000 + 5]; int vis[10000 + 5]; int p[10000][20 + 5];//p[i][j]表示第i点的第2^j个祖先 int T; int n; void adde(int u,int v) { e[k].u = u; e[k].v = v; e[k].next = head[u]; head[u] = k++; } void dfs(int u) { for(int i = head[u]; i ; i = e[i].next) { if(!deep[e[i].v]) { deep[e[i].v] = deep[u] + 1; p[e[i].v][0] = u; dfs(e[i].v); } } } void init() { int i, j; for(j = 1; (1 << j) <= n; j++) { for(i = 1; i <= n; i++) { //if(p[i][j - 1] != -1) p[i][j] = p[p[i][j - 1]][j - 1];//i的第2^j-1的祖先的第2^j-1的祖先就是i的第2^j个祖先,有点绕,可画图看 } } } int lca(int a,int b) { int i, j; if(deep[a] < deep[b])swap(a,b); for(i = 0; (1 << i) <= n; i++); i--;//找出最多跳的次数 for(j = i; j >= 0; j--) if(deep[a] - (1 << j) >= deep[b]) a = p[a][j];//跳到与b同一深度 if(a == b)return a;//此情况是a,b同点 for(j = i; j >= 0; j--) { if(p[a][j] != -1 && p[a][j] != p[b][j])//a,b的最远的不相等的祖先的父亲就是求得lca { a = p[a][j]; b = p[b][j];//不断向上跳 } } return p[a][0];//最后a的父亲便是lca } int main() { scanf("%d",&T); while(T--) { int root; memset(p,0,sizeof(p)); memset(deep,0,sizeof(deep)); memset(head,0,sizeof(head)); memset(vis,0,sizeof(vis)); //memset(e,0,sizeof(e)); k = 1; scanf("%d",&n); for(int i = 1; i < n; i++) { int a,b; scanf("%d%d",&a,&b); p[b][0] = a; adde(a,b); if(p[a][0] == 0) root = a; } deep[root] = 1; dfs(root); init(); int x,y; scanf("%d%d",&x,&y); printf("%d\n",lca(x,y)); } return 0; }
View Code
最后想说的是,为什么会超时,似乎有点问题。。到时等理解更深后在来优化吧,代码没问题。就当做模板吧
相关文章推荐
- 每天一个linux命令:tar命令-jia2
- iOS开发常用软件和好用的第三方类库
- mkswap,swapon,swapoff 创建交换分区
- android studio ADB无响应
- ggsci遇到的问题
- C语言指针
- PHP利用Gearman来处理并行多进程问题
- iOS UIToolBar的使用
- [数字dp] hdu 3565 Bi-peak Number
- flash详解(nand nor flash)
- Oracle中的COALESCE,NVL,NVL2,NULLIF函数
- Gentoo: user's permission
- zipalign 文件路径问题
- zipalign 文件路径问题
- 关情纸尾-----OC-Foundation框架中常用的类
- Android studio gradle
- 九度oj 1442
- spring-hibernate 简单dao
- 百度地图的使用
- 挑战世界顶级十七项编程