吉吉王国(二分+树形dp)
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了吉吉王国(二分+树形dp)相关的知识,希望对你有一定的参考价值。
题意:
n个点,m个边,有边权,现在要求叶子节点无法与1号点连通,要求切断的总长度不能超过m,且切断的最长的长度尽可能断
题解:
题意的前半部分可以确定是树形dp,后半部分可以确定为是二分
树形dp部分和这个题差不多
Rinne Loves Edges
我们二分一个长度的上限,然后在dp中限制,判断二分的值是否合理
代码:
#include <bits/stdc++.h>
#define endl '\\n'
using namespace std;
const int maxn=1e3+10;
typedef long long ll;
vector<pair<ll,ll> > edge[maxn];
ll sz[maxn];
ll n,m;
void dfs(ll x,ll fa,ll mid){ //mid为每条道路限制长度
bool flag=false;
for(auto i:edge[x]){
if(i.first==fa) continue;
dfs(i.first,x,mid);
flag=true;
if(i.second>mid) sz[x]+=sz[i.first];
else sz[x]+=min(i.second,sz[i.first]);
}
if(!flag) sz[x]=1e9;
}
bool che(ll x){ //最长的道路
memset(sz,0,sizeof sz);
dfs(1,0,x);
//cout<<sz[1]<<endl;
if(sz[1]<=m) return true;
else return false;
}
int main(){
cin>>n>>m;
for(ll i=0;i<n-1;i++){
ll x,y,z;
cin>>x>>y>>z;
edge[x].push_back({y,z});
edge[y].push_back({x,z});
}
ll l=1,r=m+1;
while(l<r){
ll mid=(l+r)/2;
if(che(mid))r=mid;
else l=mid+1;
}
if(l==m+1)
cout<<-1<<endl;
else
cout<<l<<endl;
}
以上是关于吉吉王国(二分+树形dp)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 3586 Information Disturbing(二分+树形dp)
HDU-3586 Information Disturbing 树形dp+二分
[bzoj3420]Poi2013 Triumphal arch_树形dp_二分