tjut 5927

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/luozhong11/article/details/53022569
#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;  
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章