dfs
#include
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+5;
vector
int deep[N],p[N];
void dfs(int u,int x,int pos)
{
p[u]=x;
deep[u]=pos;
for(int i:g[u])
{
if(i!=x)
{
dfs(i,u,pos+1);
}
}
}
int lca(int u,int v)
{
while(deep[u]>deep[v])u=p[u];
while(deep[v]>deep[u])v=p[v];
while(u!=v)u=p[u],v=p[v];
return u;
}
int main()
{
int n;cin>>n;
for(int i=1,u,v;i^n;i++)
{
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,-1,0);
int x,y;
cin>>x>>y;
printf("%dn",lca(x,y));
}
tarjan
#include
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
const int N=500005;
int vis[N],f[N],ans[N];
vector
int father(int x)
{
return f[x]==x?x:f[x]=father(f[x]);
}
void F(int x,int y)
{
int fx=father(x),fy=father(y);
if(fx!=fy)f[fx]=fy;
}
void tarjan(int u)
{
vis[u]=1;
for(int i:g[u])
{
if(!vis[i])
{
tarjan(i);
F(i,u);
}
}
for(int i=0;i { if(vis[q[u][i]]) { ans[p[u][i]]=father(q[u][i]); } } } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<=n;i++)f[i]=i; for(int i=1,u,v;i^n;i++) { scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } for(int i=1,u,v;i<=m;i++) { scanf("%d%d",&u,&v); q[u].push_back(v); q[v].push_back(u); p[u].push_back(i); p[v].push_back(i); } tarjan(1); for(int i=1;i<=m;i++) printf("%dn",ans[i]); } const int maxx = 500000 + 100; int head[maxx],depth[maxx]; int n,m,x,y,root,num; int grand[maxx][20+2]; bool done[maxx]; struct Edge{ int next; int to; }Edges[maxx<<1]; inline int Read(){ int x=0,f=1;char c=getchar(); while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();} return x*f; } void Add(int x,int y){ Edges[++num].to=y; Edges[num].next=head[x]; head[x]=num; } void Dfs(int x){ done[x]=true; for(int i=1;i<=20;i++){ if(depth[x] < (1< grand[x][i]=grand[grand[x][i-1]][i-1]; } for(int i=head[x];i;i=Edges[i].next){ int now=Edges[i].to; if(done[now]) continue; depth[now]=depth[x]+1; grand[now][0]=x; Dfs(now); } } void Lca(int x,int y){ if(depth[x]>depth[y]) swap(x,y); int d=depth[y]-depth[x]; for(int i=0;i<=20;i++){ if((1< y=grand[y][i]; } for(int i=20;i>=0;i--){ if(grand[x][i]!=grand[y][i]){ x=grand[x][i]; y=grand[y][i]; } } printf("%dn",x==y? x:grand[x][0]); } int main(){ n=Read();m=Read();root=Read(); for(int i=1;i x=Read();y=Read(); Add(x,y); Add(y,x); } Dfs(root); while( m-- ){ x=Read();y=Read(); Lca(x,y); } return 0; } 点 F[l]++,F[r]++,F[lca(l,r)]--,F[grand[lca(l,r)][0]]--; 边 F[l]++,F[r]++,F[lca(l,r)]-=2; ©著作权归作者所有:来自51CTO博客作者qinXpeng的原创作品,如需转载,请注明出处,否则将追究法律责任 lca51cto数据结构



