#include #include #define N 50005 #define INF 99999999 struct Edge { int e, next; }edge[N*2]; int head[N], eNum; int c[N], val[N], n, k, ans, dp[N][4][2]; void init() { memset(head, -1, sizeof(head)); eNum = 0; ans = 0; for(int i=0; i y ? x : y; } void dfs(int u, int fa) { dp[u][c[u]][c[u]] = val[u]; for(int i=head[u]; i!=-1; i=edge[i].next) { int v = edge[i].e; if(v==fa) continue; dfs(v, u); for(int j=0; j<=k; j++) { for(int l=0; l+j<=k; l++) { ans = max2(ans, dp[u][j][1]+dp[v][l][1]); if(j+l!=k) ans = max2(ans, dp[u][j][0]+dp[v][l][0]); ans = max2(ans, dp[u][j][0]+dp[v][l][1]); ans = max2(ans, dp[u][j][1]+dp[v][l][0]); } } for(int j=0; j