tjut 4616

来源:互联网 发布:mysql 登录失败处理 编辑:程序博客网 时间:2024/06/06 16:02
#pragma comment(linker,"/STACK:102400000,102400000")  #include <iostream>  #include <cstring>  #include <cstdio>  #include <vector>  #include <cmath>  using namespace std;  #define ReadFile(str) freopen(str,"r",stdin);  #define CLR(c,v) memset(c,v,sizeof(c))  typedef long long ll;  const int N = 5e4 + 5;    struct Node{      int val;  // 权值      int tra;  // 陷阱      bool vis; // 判断回头路      ll dp[5][2];  }node[N];  vector <int > tree[N];  ll ans;  int n,c;    void dfs(int father){ // father,child(id)  nfather,nchild(node)       int size = tree[father].size();      node[father].vis = true;      Node& nfather = node[father];            ///// init dp      int& trap = nfather.tra;      nfather.dp[trap][0] = nfather.dp[trap][1] = nfather.val;        for(int i = 0 ; i < size ; i++){          int  child  = tree[father][i];          Node& nchild = node[child];          if(nchild.vis)continue;          dfs(child);          for(int j = 0 ; j <= c ; j++){              for(int k = 0 ; k+j <= c ; k++){                  if(j != c) // 若j==c了 那么在父节点得到的最大值就没有机会再往孩子下面走了 否则还有机会往下走                      ans = max(ans , nfather.dp[j][0] + nchild.dp[k][1]); //所以转移是到父节点+另一个孩子回来                  if(k != c) // 同理                      ans = max(ans , nfather.dp[j][1] + nchild.dp[k][0]);                   if(j + k < c)// 以nfather为衔接点 当i+k==c的时候有(1||2)个端点一定在陷阱上                      ans = max(ans , nfather.dp[j][0] + nchild.dp[k][0]);                                         //ans = max(ans , nfather.dp[j][1] + nchild.dp[k][1]);               }          }          for(int j = 0 ; j <= c ; j++){              if(j+trap>c)break;              nfather.dp[j+trap][0] = max(nfather.dp[j+trap][0] , nfather.val + nchild.dp[j][0]);                  if(j) // 当前机会数 必须大于0才能网上推              nfather.dp[j+trap][1] = max(nfather.dp[j+trap][1] , nfather.val + nchild.dp[j][1]);              }      }  }    int main(){      //ReadFile("in.txt");      int T;cin >> T;      while(T--){          cin >> n >> c;          for(int i = 0 ; i < n ; i++){              scanf("%d %d", &node[i].val, &node[i].tra);              node[i].vis = false;              CLR(node[i].dp,0);          }          for(int i = 1 ; i < n ; i++){              int u,v;              scanf("%d %d", &u, &v);              tree[u].push_back(v);              tree[v].push_back(u);          }          ans = 0;          dfs(0);          cout << ans << endl;          for(int i = 0; i <= n ; i++)              tree[i].clear();      }      return 0;  }  

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果8听筒声音小怎么办 苹果6s通话声音小怎么办 苹果手机通讯录丢失了怎么办 苹果换id通讯录没有了怎么办 华为p7 更新重启怎么办 打电话的图标没了怎么办 苹果手机wifi信号弱怎么办 没电脑想装wifi怎么办 阿巴町手表二维码丢了怎么办 儿童手表二维码丢了怎么办 电话手表二维码丢了怎么办 360儿童手表二维码丢了怎么办 喜书郎电话手表二维码丢了怎么办 微信充话费充错号码怎么办 话费冲到了副卡怎么办 冲话费冲错了怎么办 微信支付未到账怎么办 速卖通修补配件到国外怎么办 速卖通流量低怎么办 速卖通被判定重复铺货怎么办 拼多多商品降权怎么办 运满满有了差评怎么办 房贷款还清后该怎么办 身份证被偷了怎么办啊 苹果手机wifi速度慢怎么办 电脑桌面上的图标不见了怎么办 夏天手机没地方放怎么办 上班手机没地方放怎么办 京东退款未到账怎么办 京东退款失败后怎么办 在京东申请退款怎么办 微信退款没收到钱怎么办 在拼多多不发货怎么办 扫二维码群发微信骗局怎么办 电脑高清晰音频管理器打不开怎么办 吃鸡耳机有杂音怎么办 分期付款车被朋友卖了怎么办 网上购物付款显示繁忙怎么办 同行招牌高于我的招牌怎么办 拼多多刷手退款怎么办 网银卡在手机上卸载了怎么办