您的位置:首页 > 其它

codevs 4605 LCA

2015-12-30 09:43 225 查看
LCA模板题,强制在线的LCA。

注意:中间的循环顺序!

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxv 100005
#define maxe 200005
using namespace std;
int n,m,g[maxv],u,v,anc[maxv][25],root,nume=0;
int dis[maxv],lastans=0;
struct edge
{
int v,nxt;
}e[maxe];
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
void dfs(int u,int fath)
{
dis[u]=dis[fath]+1;
for (int i=g[u];i;i=e[i].nxt)
dfs(e[i].v,u);
}
void work()
{
scanf("%d%d",&u,&v);
u=lastans^u;
v=lastans^v;
if (dis[u]>dis[v])
{
for (int i=19;i>=0;i--)
{
if (dis[anc[u][i]]>=dis[v])
u=anc[u][i];
}
}
else
{
for (int i=19;i>=0;i--)
{
if (dis[anc[v][i]]>=dis[u])
v=anc[v][i];
}
}
if (u==v)
{
printf("%d\n",u);
lastans=u;
}
else
{
for (int i=19;i>=0;i--)
{
if (anc[u][i]!=anc[v][i])
{
u=anc[u][i];
v=anc[v][i];
}
}
lastans=anc[u][0];
printf("%d\n",lastans);
}
}
int main()
{
memset(g,0,sizeof(g));
memset(anc,0,sizeof(anc));
memset(dis,0,sizeof(dis));
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&u);
if (u==0) root=i;
else
{
anc[i][0]=u;
addedge(u,i);
}
}
dfs(root,0);
for (int e=1;e<=19;e++)
for (int i=1;i<=n;i++)
anc[i][e]=anc[anc[i][e-1]][e-1];
scanf("%d",&m);
for (int i=1;i<=m;i++)
work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: