HDU 5266 pog loves szh III (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266
题目就是让你求LCA,模版题。注意dfs会栈溢出,所以要扩栈,或者用bfs写。
1 #pragma comment(linker, "/STACK:102400000,102400000") //扩栈 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 const int MAXN = 3e5 + 5; 7 struct data { 8 int next , to; 9 }edge[MAXN << 1]; 10 int par[MAXN][20] , head[MAXN] , cnt , dep[MAXN]; 11 12 inline void add(int u , int v) { 13 edge[cnt].next = head[u]; 14 edge[cnt].to = v; 15 head[u] = cnt++; 16 } 17 18 void dfs(int u , int d , int p) { 19 dep[u] = d; 20 par[u][0] = p; 21 for(int i = head[u] ; ~i ; i = edge[i].next) { 22 int v = edge[i].to; 23 if(v == p) 24 continue; 25 dfs(v , d + 1 , u); 26 } 27 } 28 29 void init(int n) { 30 for(int k = 0 ; k < 18 ; ++k) { 31 for(int i = 1 ; i <= n ; ++i) { 32 if(par[i][k] <= 0) 33 par[i][k + 1] = par[i][k]; 34 else 35 par[i][k + 1] = par[par[i][k]][k]; 36 } 37 } 38 } 39 40 int lca(int u , int v) { 41 if(dep[u] < dep[v]) 42 swap(u , v); 43 for(int k = 0 ; k < 20 ; ++k) { 44 if(((dep[u] - dep[v]) >> k) & 1) { 45 u = par[u][k]; 46 } 47 } 48 if(u == v) 49 return u; 50 for(int k = 19 ; k >= 0 ; --k) { 51 if(par[u][k] != par[v][k]) { 52 u = par[u][k]; 53 v = par[v][k]; 54 } 55 } 56 return par[u][0]; 57 } 58 59 int main() 60 { 61 int n , q , u , v; 62 while(~scanf("%d" , &n)) { 63 cnt = 0; 64 memset(head , -1 , sizeof(head)); 65 for(int i = 1 ; i < n ; ++i) { 66 scanf("%d %d" , &u , &v); 67 add(u , v); 68 add(v , u); 69 } 70 dfs(1 , 0 , -1); 71 init(n); 72 scanf("%d" , &q); 73 for(int i = 0; i < q; ++i) { 74 scanf("%d %d" , &u , &v); 75 printf("%d\n" , lca(u , v)); 76 } 77 } 78 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· ShadowSql之.net sql拼写神器
· Excel百万数据如何快速导入?
· 无需WebView,Vue也能开发跨平台桌面应用