hdu4714Tree2cycle

链接

树上的一些操作还是不是太好想 直接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 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3317001.html