st表求lca

對於st表求lca可以做到O(1)查詢。

對於一個歐拉序,每個點對應其第一次出現在歐拉序中的位置。

然後查詢區間dep的最小值,這是st表乾的。

完了。

void dfs(int u,int faa){
		dep[u]=dep[faa]+1;fa[u][0]=faa;dfn[u]=++cntdfn;
		fir[u]=++cntt;st[0][cntt]=u;
		for(int i=1;i<=18;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
		for(int i=first[u];i;i=nxt[i]){
			int v=to[i];if(v==faa)continue;
			dfs(v,u);st[0][++cntt]=u;
		}
	}
	void prepare(){
		lg[0]=-1;for(int i=1;i<=N*2;i++)lg[i]=lg[i>>1]+1;
		for(int i=1;i<=17;i++){
			for(int j=1;j+(1<<i)-1<=cntt;j++){
				st[i][j]=dep[st[i-1][j]]<dep[st[i-1][j+(1<<(i-1))]]?st[i-1][j]:st[i-1][j+(1<<(i-1))];
			}
		}
	}
	int Lca(int a,int b){
		int l=fir[a],r=fir[b],k;
		if(l>r)swap(l,r);
		k=lg[r-l+1];
		return dep[st[k][l]]<dep[st[k][r-(1<<k)+1]]?st[k][l]:st[k][r-(1<<k)+1];
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章