按书上大的,dfs还需加强
1 #include <bits/stdc++.h> 2 #define read read() 3 using namespace std; 4 5 int read 6 { 7 int x = 0; char ch = getchar(); 8 while(ch < 48 || ch > 57) ch = getchar(); 9 while(ch >= 48&& ch <= 57) { x = 10 * x + ch - 48; ch = getchar();} 10 return x; 11 } 12 13 const int N = 101; 14 15 int n,q; 16 int head[N],size; 17 bool vis[N]; 18 int l[N],r[N],a[N],tot[N]; 19 int f[N][N]; 20 21 struct edge{ 22 int v,nxt,w; 23 }e[N<<1]; 24 25 void add(int u,int v,int w) 26 { 27 e[++size].v = v; 28 e[size].w = w; 29 e[size].nxt = head[u]; 30 head[u] = size; 31 } 32 33 void readdata() 34 { 35 n = read; q = read; q++; 36 int u,v,w; 37 for(int i = 1; i < n; i++) 38 { 39 u = read; v = read; w = read; 40 add(u,v,w); 41 add(v,u,w); 42 } 43 } 44 45 void maketree(int u) 46 { 47 for(int i = head[u]; i ; i = e[i].nxt) 48 { 49 int v = e[i].v; 50 if(vis[v]) continue; 51 a[v] = e[i].w; 52 vis[v] = 1; 53 l[u] = v; 54 maketree(v); 55 break; 56 } 57 for(int i = head[u]; i ; i = e[i].nxt) 58 { 59 int v = e[i].v; 60 if(vis[v]) continue; 61 a[v] = e[i].w; 62 vis[v] = 1; 63 r[u] = v; 64 maketree(v); 65 break; 66 } 67 68 } 69 70 int dp(int i,int j) 71 { 72 if(!j) return 0; 73 if(!l[i] && !r[i] )return a[i]; 74 if(f[i][j]) return f[i][j]; 75 for(int k = 0; k < j; k++) 76 f[i][j] = max(f[i][j], dp(l[i],k) + dp(r[i],j - 1 - k) + a[i]); 77 return f[i][j]; 78 } 79 80 void work() 81 { 82 vis[1] = 1; 83 maketree(1); 84 /*for(int i = 1; i <= n; i++) 85 { 86 printf("%d %d \n",l[i],r[i]); 87 }*/ 88 //for(int i = 1; i <= n; i++) printf("%d ",a[i]); 89 printf("%d",dp(1,q)); 90 } 91 92 int main() 93 { 94 // freopen("apple tree.in","r",stdin); 95 readdata(); 96 work(); 97 return 0; 98 }