题目链接:点击打开链接
题意描述:给定一棵树,找出树中任意两点之间的距离?
解题思路:
1、dfs预处理达到欧拉序列
2、使用RMQ找出最近公共祖先
3、找出根到任意一点的距离,答案为dis[f]+dis[t]-2*dis[rt]
代码:
#include <cstdio> #include <cstring> #include <cmath> #include <stack> #define MAXN 40010 using namespace std; int head[MAXN],tol; struct Edge{ int to,v,next; }edge[2*MAXN]; void addEdge(int f,int t,int v){ edge[tol].to=t;edge[tol].v=v;edge[tol].next=head[f];head[f]=tol++; edge[tol].to=f;edge[tol].v=v;edge[tol].next=head[t];head[t]=tol++; } int e[2*MAXN],d[2*MAXN]; int fs[MAXN]; int dis[MAXN]; struct node{ int ct,ds; node(int _ct,int _ds):ct(_ct),ds(_ds){} }; stack<node> st; bool vis[MAXN]; void dfs(int rt){ int id=1,h=0,ds=0; while(!st.empty()) st.pop(); st.push(node(rt,ds));vis[rt]=true; while(!st.empty()){ node tmp=st.top(); rt=tmp.ct; if(fs[rt]==-1){ fs[rt]=id; dis[rt]=tmp.ds; } e[id]=rt;d[id++]=h; while(head[rt]!=-1&&vis[edge[head[rt]].to]) head[rt]=edge[head[rt]].next; if(head[rt]!=-1){ h++; vis[edge[head[rt]].to]=true; st.push(node(edge[head[rt]].to,tmp.ds+edge[head[rt]].v)); head[rt]=edge[head[rt]].next; } else { h--; st.pop(); } } } int dp[MAXN*2][18]; void makeRmqIndex(int n,int b[]){ int i,j; for(i=1;i<=n;i++) dp[i][0]=i; for(j=1;(1<<j)<=n;j++){ int limit=n+1-(1<<j); for(i=1;i<=limit;i++) dp[i][j]=b[dp[i][j-1]] < b[dp[i+(1<<(j-1))][j-1]]? dp[i][j-1]:dp[i+(1<<(j-1))][j-1]; } } int rmqIndex(int s,int v,int b[]){ int k=(int)(log((v-s+1)*1.0)/log(2.0)); return b[dp[s][k]]<b[dp[v-(1<<k)+1][k]]? dp[s][k]:dp[v-(1<<k)+1][k]; } int n,m; int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); int f,t,v; tol=0;memset(head,-1,sizeof(head)); for(int i=0;i<n-1;++i){scanf("%d%d%d",&f,&t,&v);addEdge(f,t,v);} memset(vis,false,sizeof(vis)); memset(fs,-1,sizeof(fs)); dfs(1); makeRmqIndex(2*n-1,d); for(int i=0;i<m;++i){ scanf("%d%d",&f,&t); int rt; if(fs[f]>fs[t])///注意大小 rt=rmqIndex(fs[t],fs[f],d); else rt=rmqIndex(fs[f],fs[t],d); rt=e[rt]; printf("%d\n",dis[f]+dis[t]-2*dis[rt]); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu2586 How far away ?(LCA->RMQ)
原文地址:http://blog.csdn.net/mengxingyuanlove/article/details/47984503