lca 離線模板
阿新 • • 發佈:2018-12-26
struct node
{
int v,w;
node(){}
node(int vv,int ww)
{
v=vv;w=ww;
}
};
struct edge
{
int u,v,lca;
edge(){}
edge(int uu,int vv,int ll)
{
u=uu,v=vv,lca=ll;
}
};
vector<edge>G;
vector<node>v[50000];
vector<int>g[50000];
int father[50000],rank1[50000];
void addedge(int a,int b)
{
G.push_back(edge(a,b,-1));
G.push_back(edge(b,a,-1));
int m=G.size();
g[a].push_back(m-2);
g[b].push_back(m-1);
}
int dir[50000];
void init(int n)
{
for(int i=0;i<=n;i++)
{
father[i]=i;
rank1[i]=0;
}
memset(dir,0,sizeof(dir));
}
int find(int a)
{
if(a==father[a])
return a;
return father[a]=find(father[a]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
father[y]=x;
}
int vis[50000];
void tarjan(int x)
{
vis[x]=1;
for(int i=0;i<v[x].size();i++)
{
int y=v[x][i].v;
if(vis[y])
continue;
dir[y]=dir[x]+v[x][i].w;
tarjan(y);
unite(x,y);
}
for(int i=0;i<g[x].size();i++)
{
edge & y=G[g[x][i]];
if(vis[y.v])
{
G[g[x][i]].lca=G[g[x][i]^1].lca=find(y.v);
}
}
}
ans=dir[u]+dir[v]-2*dir[lca];