旅行

112 篇文章 0 订阅


在这里插入图片描述
在这里插入图片描述
按照思路来写就行了

#include<bits/stdc++.h>
using namespace std;
struct node
{
 int to,nxt;
}sq[200100];
int n,m,dep[100100],fa[100100],all=0,head[100100];
bool vis[100100];
int read()
{
 int x=0,f=1;
 char ch=getchar();
 while((ch<'0')||(ch>'9')) 
 {
  if(ch=='-') 
   f=-1;
  ch=getchar();
 }
 while((ch>='0')&&(ch<='9')) 
 {
  x=x*10+(ch-'0');
  ch=getchar();
 }
 return x*f;
}
void add(int u,int v)
{
 all++;
 sq[all].to=v;
 sq[all].nxt=head[u];
 head[u]=all;
}
void dfs(int u,int fu)
{
 dep[u]=dep[fu]+1;
 fa[u]=fu; 
 int i;
 for(i=head[u];i;i=sq[i].nxt)
  if(sq[i].to!=fu) 
   dfs(sq[i].to,u);
}
int main()
{
 n=read();
 m=read();
 int i;
 for(i=1;i<n;i++)
 {
  int u=read(),v=read();
  add(u,v);
  add(v,u);
 }
 dep[0]=-1;
 int ans=0;
 dfs(1,0);
 memset(vis,0,sizeof(vis));
 vis[1]=1;
 for(i=1;i<=m;i++)
 {
  int x=read(),j;
  for(j=x;!vis[j];j=fa[j]) 
  {
   vis[j]=1;
   ans+=2;
  }
  printf("%d\n",ans-dep[x]);
 }
 return 0;
}

来源:zr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值