社区讨论
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 条回复,欢迎继续交流。
正在加载回复...