HIHO #1069 : 最近公共祖先·三(RMQ+DFS LCA在线算法)
2016-08-09 21:52
399 查看
题目链接
RMQ+DFS 实现在线的算法,dfs把树离散成一棵树,然后跑rmq,这个hihoCoder里面讲解的很好
RMQ+DFS 实现在线的算法,dfs把树离散成一棵树,然后跑rmq,这个hihoCoder里面讲解的很好
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<queue> #include<map> #include<set> #include<cstdlib> #include<vector> using namespace std; #define cl(a,b) memset(a,b,sizeof(a)) #define LL long long #define pb push_back #define gcd __gcd #define For(i,j,k) for(int i=(j);i<k;i++) #define lowbit(i) (i&(-i)) #define _(x) printf("%d\n",x) const int maxn = 1e6+10; const int inf = 1 << 28; int idd = 0; map<string,int> mp; map<int,string> tos; int getid(string s){ if(!mp.count(s)){ mp[s]=idd; tos[idd]=s; return idd++; } return mp[s]; } int dp[maxn][20]; int depth[maxn<<1]; int vis[maxn<<1]; int id[maxn]; vector<int> G[maxn]; void init_rmq(int n){ for(int i=0;i<n;i++)dp[i][0] = i; for(int j=1;j<20;j++){ for(int i=0;i+(1<<j)-1<n;i++){ if(depth[dp[i][j-1]] < depth[dp[i+(1<<j-1)][j-1]]) dp[i][j]=dp[i][j-1]; else dp[i][j]=dp[i+(1<<j-1)][j-1]; } } } int query(int L,int R){ int k = log2(R-L+1); if(depth[dp[L][k]]<depth[dp[R-(1<<k)+1][k]]) return dp[L][k]; return dp[R-(1<<k)+1][k]; } void dfs(int u,int fa,int d,int &k){ vis[k] = u; id[u] = k; depth[k++] = d; for(int i=0;i<G[u].size();i++){ int v = G[u][i]; if(v==u)continue; dfs(v,u,d+1,k); vis[k] = u; depth[k++] = d; } } int lca(int u,int v){ return vis[query(min(id[u],id[v]),max(id[u],id[v]))]; } int root; void solve(int n){ int k = 0; dfs(root,-1,0,k); init_rmq(n*2-1); } bool flag[maxn]; int main(){ int n;scanf("%d",&n); for(int i=0;i<n;i++){ string a,b;cin>>a>>b; G[getid(a)].pb(getid(b)); flag[getid(b)]=true; } for(int i=0;i<idd;i++)if(!flag[i]){root=i;break;} solve(n); int m;scanf("%d",&m); while(m--){ string a,b;cin>>a>>b; cout<<tos[lca(getid(a),getid(b))]<<endl; } return 0; }
相关文章推荐
- hiho_1069_最近公共祖先3
- hihocoder #1069 : 最近公共祖先·三(ST求LCA)
- hihoCoder#1069 最近公共祖先·三
- #1069 : 最近公共祖先·三
- hihoCoder #1069 最近公共祖先·三
- hihocoder1069最近公共祖先·三(LCA在线算法--DFS+RMQ-ST)
- hihoCoder 1069 最近公共祖先 在线算法
- hihoCoder 1069 最近公共祖先·三
- [HihoCoder]#1069 : 最近公共祖先·三
- hihoder #1069 : 最近公共祖先·三
- hihocoder#1069 : 最近公共祖先·三(DFS序列+线段树)
- [hiho]#1069 : 最近公共祖先·三 线段树|树转数组
- hihocoder 1069最近公共祖先(DFS + ST)java实现
- HIHO #1062 : 最近公共祖先·一
- hihocoder1069 最近公共祖先·三(trajin算法)(并查集)
- #1069 : 最近公共祖先·三
- hihoCoder_#1069_最近公共祖先·三(RMQ-ST模板)
- 二叉树的最近公共祖先、两个最远节点、第K层结点个数、出现次数超过一半的元素
- HDU 2586-How far away(最近公共祖先LCA)
- 二叉树--求二叉树中两个节点的最近公共祖先