1. 程式人生 > >lca 離線模板

lca 離線模板

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];