树上的一些操作还是不是太好想 直接dfs下去 不是最优的
一个节点最多保留两个度 如果它有两个以上的子节点 那么就与父节点断开 与k-2个子节点断开 再重新连

1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include <iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<stdlib.h> 6 #include<algorithm> 7 using namespace std; 8 #define N 2000010 9 struct node 10 { 11 int u,v,next; 12 }ed[N<<1]; 13 int n,head[N],t,ans; 14 void init() 15 { 16 t = 0; 17 memset(head,-1,sizeof(head)); 18 } 19 void add(int u,int v) 20 { 21 ed[t].u = u; 22 ed[t].v = v; 23 ed[t].next = head[u]; 24 head[u] = t++; 25 } 26 int dfs(int pre,int u) 27 { 28 int i; 29 int s=0; 30 for(i = head[u] ; i!=-1 ; i = ed[i].next) 31 { 32 int v = ed[i].v; 33 if(v==pre) continue; 34 s+=dfs(u,v); 35 } 36 if(s>=2) 37 { 38 if(u!=1) 39 ans+=2*(s-1); 40 else 41 ans+=2*(s-2); 42 return 0; 43 } 44 return 1; 45 } 46 int main() 47 { 48 int i,tt,u,v; 49 scanf("%d",&tt); 50 while(tt--) 51 { 52 scanf("%d",&n); 53 init();ans=0; 54 for(i = 1; i < n ; i++) 55 { 56 scanf("%d%d",&u,&v); 57 add(u,v); 58 add(v,u); 59 } 60 dfs(-1,1); 61 printf("%d ",ans+1); 62 } 63 return 0; 64 }