算法模板之最近公共祖先问题(LCA)
来源:互联网 发布:粮食进出口贸易数据 编辑:程序博客网 时间:2024/06/10 20:49
poj1330
最近公共祖先问题模板:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<cstdlib>#include<string>#include<vector>#define N 30000using namespace std;int id[N],vis[N],depth[N],in[N],dp[N][20],k;vector<int>G[N];int Min(int i,int j){ if(depth[i]<=depth[j]) return i; return j;}void rmq_init(int n){ for(int i=1; i<=n; i++) dp[i][0]=i; for(int j=1; (1<<j)<=n; j++) for(int i=1; i+(1<<j)-1<=n; i++) dp[i][j]=Min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}void dfs(int v,int d){ id[v]=k; vis[k]=v; depth[k]=d; k++; for(int i=0; i<G[v].size(); i++) { dfs(G[v][i],d+1); vis[k]=v; depth[k]=d; k++; }}void init(int root,int n){ k=1; dfs(root,0); rmq_init(n*2-1);}int query(int l,int r){ int k=(int)(log10(r-l+1)/log10(2.0)); return Min(dp[l][k],dp[r-(1<<k)+1][k]);}int main(){ int t,n,a,b,x,y; cin>>t; while(t--) { for(int i=0; i<N; i++) G[i].clear(); memset(in,0,sizeof(in)); cin>>n; for(int i=1; i<n; i++) { scanf("%d%d",&a,&b); G[a].push_back(b); in[b]=1; } int i; for(i=1; i<=n; i++) if(in[i]==0) break; init(i,n); cin>>x>>y; int ans=query(min(id[x],id[y]),max(id[x],id[y])); printf("%d\n",vis[ans]); } return 0;}
poj1986
求解树上两点相距的最近距离模板:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<cstdlib>#include<string>#include<vector>#define N 40010using namespace std;int vis[2*N],depth[2*N],id[N],dis[N],dp[N*2][20],k;struct node{ int to,w;};vector<node>G[N];int Min(int a,int b){ if(depth[a]<=depth[b]) return a; return b;}void rmq_init(int n){ for(int i=1; i<=n; i++) dp[i][0]=i; for(int j=1; (1<<j)<=n; j++) for(int i=1; i+(1<<j)-1<=n; i++) dp[i][j]=Min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}void dfs(int v,int p,int d){ id[v]=k; vis[k]=v; depth[k]=d; k++; for(int i=0; i<G[v].size(); i++) { if(G[v][i].to!=p) { dis[G[v][i].to]=dis[v]+G[v][i].w; dfs(G[v][i].to,v,d+1); vis[k]=v; depth[k]=d; k++; } }}void init(int n){ k=1; dfs(1,-1,0); rmq_init(2*n-1);}int query(int l,int r){ int k=(int)(log10(r-l+1)/log10(2.0)); int num=Min(dp[l][k],dp[r-(1<<k)+1][k]); return vis[num];}int main(){ int n,m,a,b,c,q,x,y; char ch[10]; while(cin>>n>>m) { for(int i=0; i<N; i++) { G[i].clear(); id[i]=0; dis[i]=0; } for(int i=0; i<m; i++) { scanf("%d%d%d%s",&a,&b,&c,ch); node nd; nd.to=b,nd.w=c; G[a].push_back(nd); nd.to=a,nd.w=c; G[b].push_back(nd); } init(n); cin>>q; while(q--) { scanf("%d%d",&x,&y); int ans=query(min(id[x],id[y]),max(id[x],id[y])); printf("%d\n",dis[x]+dis[y]-2*dis[ans]); } } return 0;}
阅读全文
1 0
- 算法模板之最近公共祖先问题(LCA)
- LCA----【模板】最近公共祖先(LCA)
- 【模板】最近公共祖先(LCA)
- 【模板】最近公共祖先(LCA)
- P3379 【模板】最近公共祖先(LCA)
- 【模板】【图论】最近公共祖先(LCA)
- 【模板】最近公共祖先(LCA)
- 最近公共祖先LCA问题(特别是Tarjin算法) 转
- 最近公共祖先(LCA)问题-在线ST算法
- [算法系列之三十一]最近公共祖先(LCA)
- LCA(最近公共祖先算法)之在线st表法
- 最近公共祖先LCA【模板】
- [模板]最近公共祖先LCA
- 【模板】lca 最近公共祖先
- 最近公共祖先算法(LCA)
- 最近公共祖先算法(LCA)
- [算法] LCA 最近公共祖先 (Tarjan)
- 最近公共祖先问题(LCA)
- 51nod 1005 大数加法
- 如何理解项目沟通管理
- Hive on Spark调优
- linux进行vi操作时的查询操作
- Android源码环境下编译自带JNI的APP
- 算法模板之最近公共祖先问题(LCA)
- VC 制作带弹出式菜单的按钮
- C#中allowdrop设置为true也不能让dragdrop事件触发解决办法
- Vim中显示不可见字符
- osg 透明度显示方式
- 关联修改数据
- 1029.旧键盘(20)
- 安装CPAT--使用CPAT分析lncRNA
- https原理理解