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;
}
注意:中间的循环顺序!
#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;
}
相关文章推荐
- win7下,memCache安装过程
- BeautifulSoup使用
- linux 下连接mysql服务器
- [[UIScreen mainScreen] bounds]和 applicationFrame
- OpenLayers学习笔记4——使用jQuery UI实现測量对话框
- IIS中启用ASP并连接Access数据库的解决办法
- Android Fragment完全解析,关于碎片你所需知道的一切 (转)。
- Redis客户端GUI工具:RedisClient
- extern的几种用法
- 基础知识--数组、栈、队列的静态、动态和链式实现
- 开始写博客了!
- 我读了struts文档
- 6大页面数据抓取工具
- 近期国际会议列表
- 安卓Json介绍(转)。
- 2015前端生态发展回顾(转)
- PHP: 深入pack/unpack
- GPS数据解析
- jQuery与Servlet实现文件上传与获取上传进度
- 英语视频