abc368 D
作者:
Air1222
,
2024-09-25 15:23:48
,
所有人可见
,
阅读 2
//分析性质
//从一个目标节点开始遍历,如果当前结点的子树中存在目标节点,则当前点必须取
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
const int N = 4e5+10;
int e[N],ne[N],h[N],idx;
map<int,bool>p;
int n,k;
int cnt;
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int u,int father)
{
int flag=false;
if(p[u]) flag=true;
for(int i=h[u];i!=-1;i=ne[i])
{
int j=e[i];
if(j==father) continue;
//if(p[j]) flag=true;
if(dfs(j,u)) flag=true;
}
if(flag) cnt++;
//cout<<u<<" "<<flag<<endl;
return flag;
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>k;
for(int i=0;i<n-1;i++)
{
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
int root;
while(k--)
{
int x;
cin>>x;
p[x]=true;
//cout<<x<<" "<<p[x]<<endl;
root=x;
}
dfs(root,-1);
cout<<cnt;
return 0;
}