https://vjudge.net/problem/HDU-6769

题目大意:给你n个点,有n-1条边,每条边有a,b两个权值,给你一个k,恰好有k条边的权值取a,其余取b的时候,树的直径的最小值。

思路:答案具有单调性直接二分直径(在比赛的时候我压根想不到),然后用这个直径对树形dp做一个限制,如果链权值相加大于mid的时候则不转移状态。dp【i】【j】代表i的子树中选择了j条边取a权值的情况下,从i出发能达到最远就距离。(类似树上背包吧)

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define sc second
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define ac cout<<ans<<"\n"
#define pb push_back
#define endl '\n'
using namespace std;
typedef long long  ll;
typedef unsigned long long  ull;
typedef pair<ll,ll> pii;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1};
const ll mod=998244353;
const ll N =5e5+10;
const ll M =250000;
const double eps = 1e-4;
//const double pi=acos(-1);
ll re(){ll x;scanf("%lld",&x);return x;
}
int n,k;
struct p{int to,nex;pii w;
}e[N];
int h[N];
ll dp[20010][21],temp[100];
int siz[20010];
int idx;
void add(int u,int v,ll a,ll b){e[idx]={v,h[u],{a,b}};h[u]=idx++;
}
void dfs(int u,int fa,ll mid){siz[u]=dp[u][0]=0;for(int i=h[u];~i;i=e[i].nex){int v=e[i].to;if(v==fa) continue;dfs(v,u,mid);int num=min(siz[u]+siz[v]+1,k);for(int j=0;j<=num;j++) temp[j]=mid+1;for(int j=0;j<=min(siz[u],num);j++){for(int p=0;p<=min(siz[v],num)&&j+p<=num;p++){if(p+j+1<=num&&dp[u][j]+dp[v][p]+e[i].w.fi<=mid)temp[j+p+1]=min(temp[j+p+1],max(dp[u][j],dp[v][p]+e[i].w.fi));if(dp[u][j]+dp[v][p]+e[i].w.sc<=mid)temp[j+p]=min(temp[j+p],max(dp[u][j],dp[v][p]+e[i].w.sc));}}siz[u]+=siz[v]+1;for(int j=0;j<=num;j++) dp[u][j]=temp[j];}}
void slove(){n=re(),k=re();for(int i=1;i<=n;i++) h[i]=-1;idx=0;ll l=0,r=0;for(int i=1;i<n;i++){ll u=re(),v=re(),a=re(),b=re();add(u,v,a,b);add(v,u,a,b);r+=max(a,b);}ll ans=0;while(l<=r){ll mid=(l+r)/2;dfs(1,0,mid);if(dp[1][k]<=mid){ans=mid;r=mid-1;}else l=mid+1;}cout<<ans<<endl;
}int main(){int t;t=re();while(t--) slove();return 0;
}

HDU - 6769-In Search of Gold-二分+树形dp相关推荐

  1. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Jav ...

  2. 吉吉王国(二分+树形dp)

    吉吉王国 题意: n个点,m个边,有边权,现在要求叶子节点无法与1号点连通,要求切断的总长度不能超过m,且切断的最长的长度尽可能断 题解: 题意的前半部分可以确定是树形dp,后半部分可以确定为是二分 ...

  3. hdu 5909 Tree Cutting——点分治(树形DP转为序列DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治的话,每次要做一次树形DP:但时间应该是 siz*m2 的.可以用 FWT 变成 siz*ml ...

  4. hdu 1520 Anniversary party(第一道树形dp)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  5. 【HDU - 6662】Acesrc and Travel(树形dp,博弈dp)

    题干: Acesrc is a famous tourist at Nanjing University second to none. During this summer holiday, he, ...

  6. *【HDU - 6201】transaction transaction transaction(树形dp 或 spfa最长路 或 网络流)

    题干: 题目大意: 给出一棵n个顶点的树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过所需要的花费.现在需要你在树上选择两个点,一个作为买入商品的点,一个作为卖出商品 ...

  7. HDU 1011 Starship Troopers星河战队(树形dp)

    题意 有n个洞穴编号为1-n,洞穴间有通道,形成了一个n-1条边的树, 洞穴的入口即根节点是1. 每个洞穴有x只bugs,并有价值y的金子,全部消灭完一个洞穴的虫子,就可以获得这个洞穴的y个金子. 现 ...

  8. P4383-[八省联考2018]林克卡特树【wqs二分,树形dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4383 题目大意 nnn个点的一棵树,要求删除kkk条边然后接上kkk条边权为000的边后形成的树上选择一对(p, ...

  9. HDU 6035 Colorful Tree(补集思想+树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6035 [题目大意] 给出一颗树,一条路径的价值为其上点权的种类数,求路径总价值 [题解] 单独考虑 ...

最新文章

  1. Java 程序员如何使用 Shiro 框架
  2. 可降阶的高阶微分方程
  3. Linux 调度器内幕
  4. 研发协同平台持续交付2.0架构演进
  5. oracle软件静默安装程序,【oracle】静默安装 oracle 11gr2
  6. Python中的Number(数字)
  7. knime二次开发节点的项目结构
  8. Flutter基础—布局模型之层叠定位
  9. 使用 leastsq 对指定函数格式进行最小二乘拟合
  10. 微信小程序中-[渲染层网络层错误] pages/card/card.wxss 中的本地资源图片无法通过 WXSS 获取-解决办法
  11. 如何用Python实现电影售票系统
  12. 【叨、校长】一个基于Extjs、Pushlet美轮美奂的Web聊天室
  13. 使用c语言实现端口全扫描程序,C语言实现TCP多线程端口扫描
  14. 使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient
  15. hulu dpp_什么是直播电视的Hulu,它可以代替您的有线电视订阅吗?
  16. SDK之aar封装总结
  17. 腾讯秀丽江山之长歌行服务器维护,《长歌行》8月28日合服公告
  18. 百分百背后是百度电商的悲哀
  19. 关于HyperLPR车牌检测使用笔迹
  20. IntelXeon Gold 6240和IntelXeon Gold 5218有什么区别? 服务器CPU选型

热门文章

  1. android studio button位置_免费的Android开发环境
  2. 这才是真正的蛙泳,还挺能蹦跶......
  3. 计算机广告制作未来发展还行吗,计算机多媒体设计专业和广告设计制作那个好...
  4. 怎样让电脑速度变快_硬盘在电脑中起什么作用?
  5. php实现电脑自动关机,用批处理实现电脑自动关机
  6. mysql数据库的安装和配置文件_MySQL 数据库安装与配置详解
  7. oracle dbf文件设置,oracle移动数据dbf文件
  8. java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...
  9. linux select读取节点数据失败_MySQL中覆盖索引查询和select*查询执行结果案例分析...
  10. 算法——常用的数据结构/模板/基础知识