1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
#include <bits/stdc++.h> #define debug(x) cerr<<#x<<":"<<x<<"\n";
using namespace std;
using ll = long long; constexpr ll MAXN=(ll)2e5+10;constexpr ll INF=(ll)1e17+9; constexpr ll mod=(ll)1e9+7;constexpr double eps=1e-8;const double pi=acos(-1.0);
vector<ll> g[MAXN]; vector<ll> que[MAXN]; ll deep[MAXN]; bitset<MAXN> vis; ll Fa[MAXN],out[MAXN],in[MAXN]; bool cmp(const ll &a,const ll &b){ return deep[a]<deep[b]; } inline void solve(){ ll N,M; cin>>N>>M; for(int i=1;i<=N-1;++i){ ll u,v;cin>>u>>v; g[u].push_back(v);g[v].push_back(u); } for(int i=1;i<=M;++i){ ll k; cin>>k; for(int j=1;j<=k;++j){ ll v;cin>>v; que[i].push_back(v); } } ll toti=0,toto=0; auto dfs=[&](auto &&self,ll u,ll dep,ll pa)->void{ vis[u]=true,deep[u]=dep,Fa[u]=pa,in[u]=++toti; for(int i=0;i<g[u].size();++i){ ll v=g[u][i]; if(vis[v]) continue; self(self,v,dep+1,u); } out[u]=++toto; }; dfs(dfs,1,0,1); for(int i=1;i<=M;++i){ sort(que[i].begin(),que[i].end(),cmp); for(int j=0;j<que[i].size();++j){ que[i][j]=Fa[que[i][j]]; } ll din=in[que[i].back()],dout=out[que[i].back()]; bool isB=false; for(int j=(int)que[i].size()-2;j>=0;--j){ ll node=que[i][j]; if(in[node]<=din && out[node]>=dout){ }else{ cout<<"NO\n";isB=true; break; } } if(!isB)cout<<"YES\n"; }
}
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); solve(); return 0; }
|