#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10101;
const int qmaxn=501010;
int F[maxn];
int find(int x)
{
if(F[x]==-1)return x;
return F[x]=find(F[x]);
}
void bing(int u,int v)
{
int t1=find(u);
int t2=find(v);
if(t1!=t2)
F[t1]=t2;
}
bool vis[maxn];
int ancestor[maxn];
struct edge
{
int to,next;
}edge[maxn*2];
int head[maxn],tot;
void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
struct Query
{
int q,next;
int index;
}query[qmaxn*2];
int answer[qmaxn],h[qmaxn],tt,Q;
void add_Query(int u,int v,int index)
{
query[tt].q=v;
query[tt].next=h[u];
query[tt].index=index;
h[u]=tt++;
query[tt].q=u;
query[tt].next=h[v];
query[tt].index=index;
h[v]=tt++;
}
void init()
{
tot=0;
tt=0;
memset(head,-1,sizeof(head));
memset(h,-1,sizeof(h));
memset(F,-1,sizeof(F));
memset(vis,0,sizeof(vis));
memset(ancestor,0,sizeof(ancestor));
}
void LCA(int u)
{
ancestor[u]=u;
vis[u]=true;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v])continue;
LCA(v);
bing(u,v);
ancestor[find(u)]=u;
}//ancestor数组。该数组用来存储每个节点的祖先
for(int i=h[u];i!=-1;i=query[i].next)
{
int v=query[i].q;
if(vis[v])
{
ancestor[find(v)];//u,v的最近祖先
}
}
}
int main ()
{
}
lca 离线tarjan模板
最新推荐文章于 2020-09-02 11:13:53 发布