重点就是把不是重要的点按照深度排序,然后按照孩子的个数来判断这个点是不是能够加到集合里。
#include <bits/stdc++.h>using namespace std;const int MAXN=1e5+7;int fa[MAXN],son[MAXN],temp[MAXN],deep[MAXN];bool vis[MAXN];int uimp[MAXN];vector<int>head[MAXN];int n,m,k;void dfs(int u,int f,int d){ vis[u]=1; fa[u]=f; deep[u]=d; for(int i=0,l=head[u].size();i<l;++i) { int v=head[u][i]; if(!vis[v]) { son[u]++; dfs(v,u,d+1); } }}bool cmp(int a,int b){ return deep[a]>deep[b];}int main(){ int t; int i; scanf("%d",&t); for(int tt=1;tt<=t;++tt) { scanf("%d%d",&n,&m); for(i=1;i<=n;++i) { head[i].clear(); son[i]=vis[i]=0; } int u,v; for(i=0;i<n-1;++i) { scanf("%d%d",&u,&v); head[u].push_back(v); head[v].push_back(u); } dfs(1,0,0); PRintf("Case #%d:/n",tt); while(m--) { scanf("%d",&k); int ans=n-k; for(i=0;i<k;++i) { scanf("%d",&uimp[i]); temp[uimp[i]]=son[uimp[i]]; } sort(uimp,uimp+k,cmp); for(i=0;i<k;++i) { if(temp[uimp[i]]>1)ans++; else if(!temp[uimp[i]])temp[fa[uimp[i]]]--; } printf("%d/n",ans); } } return 0;}
新闻热点
疑难解答