30分求助
查看原帖
30分求助
636409
Headofstate1945楼主2023/11/25 11:14
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
int sum[N],f[N][22],dep[N];
vector<int>g[N];
void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	sum[u]+=sum[fa];
	for(int i=1;f[u][i-1];i++)f[u][i]=f[f[u][i-1]][i-1];
	for(int v:g[u]){
		if(v==fa)continue;
		dfs(v,u);
	}
}
int lca(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	for(int i=19;~i;i--){
		if(dep[f[u][i]]>=dep[v])u=f[u][i];
	}
	if(u==v)return u;
	for(int i=19;~i;i--){
		if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i]; 
	}
	return f[u][0];
}
signed main(){
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1,x,y;i<n;i++){
		cin>>x>>y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	for(int i=1;i<=n;i++)sum[i]=g[i].size();
	dfs(1,-1);
	for(int i=1,x,y;i<=m;++i){
		cin>>x>>y;
		cout<<sum[x]+sum[y]-2*sum[lca(x,y)]+g[lca(x,y)].size()<<endl;
	}
	return 0;
}

2023/11/25 11:14
加载中...