社区讨论

70pts(30pts无输出)

P10289[GESP样题 八级] 小杨的旅游参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mmhkhoto
此快照首次捕获于
2026/03/08 17:46
前天
此快照最后确认于
2026/03/08 21:24
前天
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
int n,k,q;
int dep[200010];
int fa[200010][28],lg[200010],dp[200010];
vector<int> g[200010];
queue<int> qu;
void dfs(int x,int fat){
	dep[x]=dep[fat]+1;
	fa[x][0]=fat;
	for(int i=1;i<=20;i++){
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=0;i<g[x].size();i++){
		if(g[x][i]!=fat) dfs(g[x][i],x);
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	while(dep[x]>dep[y]) x=fa[x][lg[dep[x]-dep[y]]];
	if(x==y) return x;
	for(int i=20;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
void bfs(){
	while(!qu.empty()){
		int t=qu.front();
		qu.pop();
		for(int i=0;i<g[t].size();i++){
			if(dp[g[t][i]]==INT_MAX){
				dp[g[t][i]]=dp[t]+1;
				qu.push(g[t][i]);
			}
		}
	}
}
int main(){
    scanf("%d%d%d",&n,&k,&q);
    for(int i=0;i<=n;i++){
		dp[i]=INT_MAX;
	}
    for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	lg[1]=0;
	for(int i=2;i<=n;i++){
		lg[i]=lg[i/2]+1;
	}
	dfs(1,0);
	for(int i=1;i<=k;i++){
		int x;
		scanf("%d",&x);
		qu.push(x);
		dp[x]=0;
	}
	bfs();
	while(q--){
		int t,tt;
		scanf("%d%d",&t,&tt); 
		printf("%d\n",min(dp[t]+dp[tt],dep[t]+dep[tt]-2*dep[lca(t,tt)]));
	}
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...