这个题,大佬说是水题,对我这种菜鸡来说,看了好久才懂。。。。
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <vector>
#define inf 0x3f3f3f3f
using namespace std;
/*
①如果k==c,那么起点和终点至少有一个是陷阱(可能有些人会认为终点一定会是陷阱,这样是没错的,因为起点和终点时相对的,你也可以把起点看做终点)。
②如果k<c,那么起点和终点是否是陷阱是任意的,可以有也可以没有。
*/
//这个题和CCF上做的第四题差不多,dp[i][j]做树形dp是模板,这里加了陷阱的条件,自然要多一维。
const int N = 50010;
vector<int> g[N];
int val[N],trap[N];
long long dp[N][4][2];
int T,n,c;
long long ans;
void dfs(int parent,int child){
dp[child][trap[child]][trap[child]] = val[child];
ans = max(ans,dp[child][trap[child]][trap[child]]);//是原来的路好,还是以child做起点更好???????????
for(int i=0;i<g[child].size();i++){
int v = g[child][i];