倍增MLE求条
查看原帖
倍增MLE求条
1358961
LG_Sam楼主2025/1/24 11:09
#include<bits/stdc++.h>
using namespace std;
#define MX 500005
namespace iakioi{
	vector<int>g[MX];
	int d[MX],f[MX][19],n,m,s;
	void dfs(int rt,int q,int p){
    	d[rt]=q;
    	f[rt][0]=p;
    	for(int i=0;i<g[rt].size();i++){
    	    int to=g[rt][i];
    	    if(q==to) continue;
    	    dfs(to,q+1,rt);
    	}
	}
	int lca(int x,int y){
    	int ms;
    	if(d[x]>d[y]) swap(x,y);
    	for(int i=18;i>=0;i--){
    	    if(d[f[x][i]]>=d[y]) x=f[x][i];
    	}
    	if(x==y) return x;
    	for(int i=18;i>=0;i--){
        	if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
        	else ms=f[x][i];
    	}
    	return ms;
	}
	void main(){
		cin.tie(0);
   		cout.tie(0);
    	cin>>n>>m>>s;
    	for(int i=1;i<=n-1;i++){
    	    int u,v;
    	    cin>>u>>v;
    	    g[u].push_back(v);
    	    g[v].push_back(u);
    	}
    	dfs(s,1,0);
    	for(int j=18;j>=0;j--){
    	    for(int i=1;i<=n;i++){
    	        f[i][j]=f[f[i][j-1]][j-1];
    	    }
    	}
    	while(m--){
        	int a,b;
        	cin>>a>>b;
        	cout<<lca(a,b);
    	}
	}
}

int main(){
    iakioi::main();
    return 0;
}
2025/1/24 11:09
加载中...