```cpp
for( int i = 1 ; i <= n ; ++i )cout << sz[i] << " ";
```
你把debug保留干啥
by Yuina @ 2023-09-06 22:54:54
还有你代码里的 `val[i]` 不应该是第 i 条边的权值吗,你直接当成第 i 个点算了
by Yuina @ 2023-09-06 22:58:45
~~首先,谢谢大佬,~~
改成23tps了。。。
```
#include<bits/stdc++.h>
#define ms(x,v) memset(x,v,sizeof(x));
using namespace std;
const int N = 105;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int f[N][N];//维度含义:1.当前节点i,2.砍k条边的最优解
int n, q, head[N], cnt = 1;
struct Edge{
int to, nxt, w;
}e[N*2];
int val[N], out[N], sz[N];
void addedge( int u , int v , int d ){
e[++cnt].to = v;
e[cnt].nxt = head[u];
e[cnt].w = d;
head[u] = cnt;
}
void dfs( int u , int fa ){
if( out[u] == 0 ){
return ;
}
sz[u] = out[u];
for( int i = head[u] ; i ; i = e[i].nxt ){
int v = e[i].to;
if( v != fa ){
dfs(v,u);
sz[u] += sz[v] + 1;
}
for( int j = min(sz[u],q); j >= 1 ; --j ){
for( int k = min(j-1,sz[v]) ; k >= 0 ; --k ){
f[u][j] = max(f[u][j],f[u][j-k-1] + f[v][k] + e[i].w);
}
}
}
}
int main()
{
n = read(), q = read();
int a, b, c;
for( int i = 1 ; i < n ; ++i ){
a = read(); b = read(); c = read();
addedge(a,b,c);
addedge(b,a,c);
out[a]++;
}
dfs(1,0);
cout << f[1][q] << "\n";
return 0;
}
```
最后,谢谢大佬
by wangchengxi @ 2023-09-07 19:32:17
AC on #1, #5, #13~~(我也不知道为什么13能过)~~
by wangchengxi @ 2023-09-07 19:33:58