倍增lca模板
2014-01-10 18:28
225 查看
看cf代码,看到别人写得那么简洁,学习了。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int maxn=200020;
int head[maxn],tol,deg[maxn],fa[maxn][23];
struct node
{
int next,to;
}edge[20*maxn];
void add(int u,int v)
{
edge[tol].to=v;
edge[tol].next=head[u];
head[u]=tol++;
}
void dfs(int u,int pre)
{
deg[u]=deg[pre]+1;
fa[u][0]=pre;
for(int i=1;i<23;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(v==pre)continue;
dfs(v,u);
}
}
int lca(int x,int y)
{
if(deg[x]<deg[y])swap(x,y);
for(int i=0;i<22;i++)if((deg[x]-deg[y])&(1<<i))x=fa[x][i];
if(x==y)return x;
for(int i=22;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int main()
{
int i,j,k,m,n;
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
while(cin>>n>>m)
{
memset(head,-1,sizeof(head));tol=0;
for(i=1;i<n;i++)
{
cin>>j>>k;
add(j,k);
add(k,j);
}
dfs(1,1);
// for(i=1;i<=n;i++)cout<<deg[i]<<" ";cout<<endl;
while(m--)
{
cin>>i>>j;
cout<<lca(i,j)<<endl;
}
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int maxn=200020;
int head[maxn],tol,deg[maxn],fa[maxn][23];
struct node
{
int next,to;
}edge[20*maxn];
void add(int u,int v)
{
edge[tol].to=v;
edge[tol].next=head[u];
head[u]=tol++;
}
void dfs(int u,int pre)
{
deg[u]=deg[pre]+1;
fa[u][0]=pre;
for(int i=1;i<23;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(v==pre)continue;
dfs(v,u);
}
}
int lca(int x,int y)
{
if(deg[x]<deg[y])swap(x,y);
for(int i=0;i<22;i++)if((deg[x]-deg[y])&(1<<i))x=fa[x][i];
if(x==y)return x;
for(int i=22;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int main()
{
int i,j,k,m,n;
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
while(cin>>n>>m)
{
memset(head,-1,sizeof(head));tol=0;
for(i=1;i<n;i++)
{
cin>>j>>k;
add(j,k);
add(k,j);
}
dfs(1,1);
// for(i=1;i<=n;i++)cout<<deg[i]<<" ";cout<<endl;
while(m--)
{
cin>>i>>j;
cout<<lca(i,j)<<endl;
}
}
return 0;
}
相关文章推荐
- 算法模板——倍增求LCA
- 倍增LCA模板
- 【 lca倍增模板】
- 【模板】倍增LCA
- 【讲解+模板】最近公共祖先(LCA)(倍增)
- [模板] - LCA倍增
- 倍增(RMQ与LCA)模板
- [模板]倍增LCA
- 倍增感受,以及lca倍增模板
- HDU-2586-How far away ?(倍增求LCA模板)
- 【模板】【p3379】【LCA】 倍增(好写好用)
- POJ 1330 LCA倍增模板题
- poj1330 lca倍增算法模板
- 倍增法求lca 模板
- hdu2586 倍增lca模板
- 洛谷P3379 模板LCA(倍增)
- 【LCA】倍增模板
- 倍增LCA模板
- 洛谷.4180.[模板]次小生成树Tree(Kruskal LCA 倍增)
- 【LCA倍增模板】【poj1330】最近公共祖先