本题是一个思维题,我们想到,如果一个边左右两侧的点都超过k个,那么他就可以用交集,不然的话就没有交集,因为会有一遍没法k个
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<string> #include<cstring> #include<map> #include<set> using namespace std; typedef long long ll; const int N=1e5+10; const int inf=0x3f3f3f3f; vector<int> m[N]; int s[N]; void dfs(int u,int fa){ int i; s[u]=1; for(i=0;i<m[u].size();i++){ if(m[u][i]==fa) continue; dfs(m[u][i],u); s[u]+=s[m[u][i]]; } } int main(){ int t; int n,k; cin>>t; while(t--){ cin>>n>>k; memset(s,0,sizeof s); for(int i=1;i<=n;i++) m[i].clear(); for(int i=0;i<n-1;i++){ int u,v; scanf("%d%d",&u,&v); m[u].push_back(v); m[v].push_back(u); } dfs(1,-1); int ans=0; for(int i=1;i<=n;i++){ if(s[i]>=k&&n-s[i]>=k) ans++; } printf("%d ",ans); } }