#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include <ctime>
#include<queue>
#include<set>
#include<map>
#include<list>
#include<stack>
#include<iomanip>
#include<cmath>
#include<bitset>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
///#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef long double ld;
#define INF (1ll<<60)-1
#define Max 1e9
using namespace std;
int T;
int n,m,q;
struct edge{
int v,next;
}e[400100];
int head[400100],tot,son[200100],sz2[200100],deep[200100],a[200100];
int fa[200100];
int change[200100],change2[200100];
void init(){
tot=1;
mst(head,-1);
for(int i=0;i<=n;i++) {
son[i]=0;
deep[i]=0;
fa[i]=-1;
change[i]=0;
sz2[i]=0;
change2[i]=0;
}
}
void Add(int u,int v){
e[tot].v=v;
e[tot].next=head[u];
head[u]=tot++;
}
void DFS(int u,int Fa,int dep){
deep[u]=dep;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].v;
if(v==Fa) continue;
fa[v]=u;
DFS(v,u,dep+1);
son[u]++;
}
}
bool cmp(int x,int y){
return deep[x]>deep[y];
}
int main(){
scanf("%d",&T);
for(int cas=1;cas<=T;cas++){
scanf("%d%d",&n,&q);
init();
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
Add(u,v);
Add(v,u);
}
fa[1]=0;
son[0] = 1;
DFS(1,0,1);
printf("Case #%d:\n",cas);
while(q--){
scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&a[i]);
sort(a+1,a+m+1,cmp);
int ans=0;
for(int i=1;i<=m;i++){
if(son[a[i]] == 0) {
son[fa[a[i]]]--;
change[fa[a[i]]]++;
}
if(son[a[i]] >= 2) {
ans++;
continue;
}
}
printf("%d\n",n-m+ans);
for(int i = 1; i <= m; ++i) {
if(change[fa[a[i]]]) {
son[fa[a[i]]] += change[fa[a[i]]];
change[fa[a[i]]] = 0;
}
}
}
}
return 0;
}
04-25
04-25
04-25
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交