Description
P3915-树的分解-(dfs)
栏目:公司新闻 发布时间:2024-07-16
 #include<stdio.h>  #include<iostream>  #include<algorithm>  #include<cstring>  #include<math.h>  #include<string>  #include<map>  #include<queue>  #in

  #include<stdio.h>

  #include<iostream>

  #include<algorithm>

  #include<cstring>

  #include<math.h>

  #include<string>

  #include<map>

  #include<queue>

  #include<stack>

  #include<set>

  #include<ctime>

  #define ll long long

  #define inf 0x3f3f3f3f

  const double pi=3.1415926;

  using namespace std;

  vector<int>a[100086];

  int t,n,k;

  int dfs(int x,int last)///当前点,父节点

  {

  int res=1;///自己是一个节点,看看有没有没有剪掉的子节点贡献给自己顺便返回给父亲

  for(int i=0;i<a[x].size();i++)

  {

  int next=a[x][i];

  if(next==last)///无向图存两边防止死循环

  continue;

  int num=dfs(next,x);///子树的节点树

  if(num==-1)

  return -1;

  if(num==k) ///不断dfs,只要形成k节点的子树就可以剪掉,不累加计数

  continue;

  if(num>k)///

  return -1;

  res+=num;

  }

  return res;

  }

  int main(){

  scanf("%d",&t);

  while(t--){

  scanf("%d %d",&n,&k);

  for(int i=1;i<=n;i++)

  a[i].clear();

  for(int i=1;i<n;i++){

  int x,y;

  scanf("%d%d",&x,&y);

  a[x].push_back(y);

  a[y].push_back(x);

  }

  int ans=dfs(1,1);

  if(ans==k)

  printf("YES

  ");

  else

  printf("NO

  ");

  }

  return 0;

  }